(1)题目内容:
(2)思路及解题代码:
class Search{
//思路1:将数组排序后,当某一元素与其前一个元素的差不为1时,可找到缺失的数。
public static int SearchLostNumber1(int a[]){
//将传入数组排序;
Arrays.sort(a);
//排序后首项非0则缺0,并消除索引0对下列操作的影响。
if(a[0]!=0){
return 0;
}
for (int i = 1; i < a.length ; i++) {
if (a[i]!=a[i-1]+1){
return a[i]-1;
}
}
//[0,n]之间,经历上述操作,得知数组中数据从0开始连续,则缺失的一定为n;
return a.length;
}
//思路2:定义另一个数组,记录每个数字出现次数,出现次数为零即为缺失数字。
public static int SearchLostNumber2(int a[]){
int b []=new int[a.length+1];
for(int c:a){
b[c]++;
}
for (int i = 0; i < b.length; i++) {
if(b[i]==0){
return i;
}
}
//由于我们输入数组是设计好的,但编译器认为有可能会找不到。思路三和一相当于把找不到的情况与某种情况放一起了。
return -1;
}
//思路3:假设不存在缺失,求设想数组(长度=实际数组长度+1)总和;再将实际数组求和,通过二者差值判断缺失数字;
public static int SearchLostNumber3(int a[]){
int sumOfImagine=0;
int sumOfFact=0;
//求设想总和[0,n]:
int n=a.length;
sumOfImagine=(n*(n+1))/2;
//求实际总和:
for (int b:a){
sumOfFact+=b;
}
return sumOfImagine-sumOfFact;
}
}
(3)测试代码及运行结果:
public class Day7 {
public static void main(String[] args) {
int nums1[]=new int[]{3,0,1};
int nums2[]=new int[]{0,1};
int nums3[]=new int[]{9,6,4,2,3,5,7,0,1};
int nums4[]=new int[]{1,2,3};
//1,
System.out.print(Search.SearchLostNumber1(nums1)+" ");
System.out.print(Search.SearchLostNumber1(nums2)+" ");
System.out.print(Search.SearchLostNumber1(nums3)+" ");
System.out.println(Search.SearchLostNumber1(nums4));
//2,
System.out.print(Search.SearchLostNumber2(nums1)+" ");
System.out.print(Search.SearchLostNumber2(nums2)+" ");
System.out.print(Search.SearchLostNumber2(nums3)+" ");
System.out.println(Search.SearchLostNumber2(nums4));
//3,
System.out.print(Search.SearchLostNumber3(nums1)+" ");
System.out.print(Search.SearchLostNumber3(nums2)+" ");
System.out.print(Search.SearchLostNumber3(nums3)+" ");
System.out.println(Search.SearchLostNumber3(nums4));
}
}