两个数组的交集,加一,移动零,两数之和

对于在校学生参加秋季招聘或者春季招聘,经常会面对这么一个问题,求两个数组的交集,学生们通常会回答,两层循环叠加,其实里面有一个最关键的东西就是flag[]数组标记,因为这个可以避免重复查找数组中的元素。代码如下:(用到了List类,因为取出元素很方便,就用到了list.get()函数与list.add()函数)

package com.imooc;
import java.util.List;
import java.util.ArrayList;
public class Solution{
    public int[] intersect(int[] nums1, int[] nums2) {
     int len1 = nums1.length;
     int len2 = nums2.length;
     int len = Math.min(len1,len2);
     int []flag = new int[len];
     
     List<Integer> list = new ArrayList<Integer>();
    if(len1>len2)
    {
    for(int i=0;i<len1;i++)
    {
    for(int j=0;j<len;j++)
    {
    if(nums1[i]==nums2[j]&&flag[j]==0)
    {
    list.add(nums2[j]);
    flag[j]=1;
    break;
    }
    }
    }
    }
    else if(len2>=len1)
    {
    for(int i=0;i<len2;i++)
    {
    for(int j=0;j<len;j++)
    {
    if(nums1[j]==nums2[i]&&flag[j]==0)
    {
    list.add(nums1[j]);
    flag[j]=1;
    break;
    }
    }
    }
    }
    int size = list.size();  
        int[] result = new int[size];   
        for (int i = 0; i < size; i++)   
            result[i] = list.get(i);  
        return result;  
    }

}

对于给一个数字加一,即将一个数字的每一位放入一个数组中,如果是一个int型,则用连环除法与求余数法,将每一位放入一个数组中,如果是字符串型,则用charAt()函数,把每一位拆下来,强制类型转换放入数组中,然后从数组最后一位加1,代码如下:

package com.imooc;
import java.util.Arrays;
public class Solution{
public int[] plusOne(int[] digits) {
int sum=0;
     for(int i=digits.length-1;i>=0;i--)   
     {
    sum = digits[i]+1;
    if(sum==10)
    {
    digits[i]=0;
         }
    else 
    {
    digits[i]=sum;
    break;
    }
     }
     if(sum==10)
     {
    int []result = new int[digits.length+1];
    for(int i=1;i<result.length;i++)
    {
    result[i]=digits[i-1];
    }
    result[0]=1;
    return result;
     }
     return digits;
    }
public static void main(String[]args){
Solution solve = new Solution();
        int []digits = new int[]{9,9,9,9};
        System.out.println(Arrays.toString(solve.plusOne(digits)));
}

}

移动零这种题的方法,就是不断将0与非0数字,相互交换,将0换到数组最后,代码如下:

package com.imooc;
public class Solution{
public void moveZeroes(int[] nums) {
      int currentNum;
      int startIndex=0;
      int endIndex=0;
      int i;
  for(i=0;i<nums.length;i++)    
      {
  currentNum = nums[i];
      if(currentNum==0)
      {
      startIndex=i;
      endIndex=i;
      break;
      }
      }
  if(nums[endIndex]!=0)
  {
  System.out.println("数组中不存在0");
  return ;
  }
  ++i;
  while(i<nums.length)
  {
  currentNum=nums[i];
  if(currentNum==0)
  {
  endIndex=i;
  }
  else
  {
  nums[startIndex]=currentNum;
  nums[i]=0;
  startIndex++;
  endIndex++;
  }
  ++i;
  }
  for(int j=0;j<nums.length;j++)
  {
  System.out.print(nums[j]+" ");
  }
    }
public static void main(String[]args){
      int []nums = new int[]{0,1,2,0,3,0};
      Solution solve = new Solution();
      solve.moveZeroes(nums);
}

}

两数之和,采用了HashMap去寻找数组与索引之间的关系,引用函数containsKey(),put(),get();发现HashMap可以有效处理数组与索引之间的关系,代码如下:

package com.imooc;

import java.util.Map;
import java.util.HashMap;
import java.util.Arrays;
public class Solution{
   public int[] twoSum(int[] nums, int target) {
  int []result = new int[2];
  Map<Integer,Integer> map = new HashMap<>();
  for(int i=0;i<nums.length;i++)
  {
  map.put(nums[i],i);
  }
  for(int i=0;i<nums.length;i++)
  {
  int v = target-nums[i];
  if(map.containsKey(v)&&i!=map.get(v))
  {
  result[0]=i;
  result[1]=map.get(v);
  return result;
  }
  }
  return result;
    }
   public static void main(String[]args){
   int []nums = new int[]{2,7,11,15};
   int target = 9;
   Solution solve = new Solution();
   System.out.println(Arrays.toString(solve.twoSum(nums, target)));
   }

}

有效的数独

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luolvzhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值