算法基础第一话

2018年3月24号,星期六,晴

今天第一次效仿曾经大佬们所写的博客,坚持每天联系5道ACM习题,不放弃。

今天共写了5道关于处理数组问题的编程题,用Java写的,思想很简单,很白痴,都是算法的基础,以此每天练习5道,弥补大学的缺憾。

第一道 从排序中删除重复项

这道题给出了一个有序的数组去删除重复的项数,从数组的第一个开始依次往后查探,当两个相邻项的值不一样时,就将那个不一样的项往数组的第二个放置,依次往后,以此类推,将新定义的那个控制依次往后放数组的索引变量 j 的最终答案作为该数组的长度,后面产生的不用管。

package com.imooc;

public class Solution {

  public int removeDuplicates(int[] nums) {
  int j=1;
  for(int i=1;i<nums.length;i++)
  {
if(nums[i]!=nums[i-1])
{
nums[j]=nums[i];
j++;
}
  }
        return j;
    }
  public static void main(String[]args){
  int []arr=new int[]{1,2,2,3,3,3,100,100};
  Solution solve = new Solution();
  int length = solve.removeDuplicates(arr);
  for(int i=0;i<length;i++)
  {
  System.out.print(arr[i]+" ");
  }
  }

第二道 存在重复

判断数组中是否存在重复,调用了Java中的类Set与HashSet,具体思想是将数组中的所有元素都放置到哈希队列中去,用哈希类中的set.contains()函数,判断数组中是否已包含某个数组,如果包含则返回true,不包含则返回false。判断完后,用set.add()在哈希队列中加数字,将数组中的元素以此写入队列。

package com.imooc;
public class Solution{
  public boolean containsDuplicate(int[] nums) {
         Set<Integer> set = new HashSet<Integer>();
    for(int i=0;i<nums.length;i++)
    {
    if(set.contains(nums[i]))
        {
      return true;
        }
    set.add(nums[i]);
    }
    return false;
    }
  public static void main(String[]args){
     Solution solve = new Solution();
     int []nums = new int[]{1,2,3,3,2,1};
     System.out.println(solve.containsDuplicate(nums));
  }

}

第三道 买卖股票的最佳时机

这道题的思想很简单,就是遍历一个数组,定义一个变量sum用于存放最后的最大利润,遍历数组,找到数组中后面一个比前面一个要大的那种情况,就用后一个减去前一个,所得到的数字,加入sum,最终得到总和。

package com.imooc;
public class Solution {
  public int maxProfit(int[] prices) {
  int sum=0;
  for(int i=1;i<prices.length;i++)
  {
  if(prices[i]>prices[i-1])
  {
  sum+=(prices[i]-prices[i-1]);
  }
  }
        return sum;
    }
  public static void main(String[]args)
  {
  int []prices=new int[]{5,1,2,3,4};
  Solution solve = new Solution();
  int Sum=0;
  Sum=solve.maxProfit(prices);
  System.out.println("the sum is:"+Sum);
  }

}

第四道 旋转数组

这道题思想很明确,先将整个数组倒置,然后从他要旋转的那个位置,将前一部分倒置,再将后一部分倒置,便得到了数组旋转的效果与功能。

package com.imooc;
public class Solution{
public void rotate(int[] nums, int k) {
        k=(nums.length+(k%nums.length))%nums.length;
        int tmp;
        for(int i=0,j=nums.length-1;i<j;i++,j--)
        {
        tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
        }
        for(int i=0,j=k-1;i<j;i++,j--)
        {
        tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;

        }
        for(int i=k,j=nums.length-1;i<j;i++,j--)
        {
        tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
        }
        for(int i=0;i<nums.length;i++)
        {
        System.out.print(nums[i]+" ");
        }
}
public static void main(String[] args){
int []nums=new int[]{1,2,3,4,5,6,7};
Solution solve =  new Solution();
solve.rotate(nums, 3);
}
}

第五道 只出现一次的数字

本题难度很低,只是在一个数组中只有一个数字无重复项,其他的数字都有两个。所有判断的依据可以用数字“两两异或”来判断是否存在重复,因为相同的数字异或会变成0,所以以此遍历整个数组,以得到那个只出现一次的数字。 

package com.imooc;
public class Solution{
public int singleNumber(int []nums){
int num=0;
for(int i=0;i<nums.length;i++){
num ^= nums[i];
}
return num;
}
public static void main(String[]args){
Solution solve = new Solution();
int []nums = new int[]{2,2,3,1,3,4,4};
System.out.println(solve.singleNumber(nums));
}

}


猜你喜欢

转载自blog.csdn.net/luolvzhou/article/details/79677620