对于在校学生参加秋季招聘或者春季招聘,经常会面对这么一个问题,求两个数组的交集,学生们通常会回答,两层循环叠加,其实里面有一个最关键的东西就是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)));
}
}
有效的数独