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));
}
}