题目描述(简单题)
解法
1、常规查找(线性)
因为数组是有序的,所以它的下标就是它的值。
public int solve(int[]a){
if(a==null || a.length<1) return 0;
for(int i=0;i<a.length;i++){
if(a[i]!=i)
return i;
}
return a.length;
}
时间复杂度O(n);
2、二分查找
import java.util.*;
public class Solution {
/**
* 找缺失数字
* @param a int整型一维数组 给定的数字串
* @return int整型
*/
public int solve (int[] a) {
// write code here
if(a==null || a.length<1) return 0;
int left=0,right=a.length-1;
while(left<=right){
int mid = (left+right)/2;
if(a[mid]==mid){
//说明在前面
left = mid+1;
}else if(a[mid]>mid){
//前面少了一个数
right = mid-1;
}//不会出现a[mid]<mid的情况,这样数据就不是有序的了。
}
return left;
}
}
3、使用题目的特性(利用异或)
因为下标就是对应的实际的数,那么连同下标一起,使用异或,利用异或一个数两次得到0的特性,那么少了的哪个数最后就得到了。
import java.util.*;
public class Solution {
/**
* 找缺失数字
* @param a int整型一维数组 给定的数字串
* @return int整型
*/
public int solve (int[] a) {
// write code here
if(a==null || a.length<1) return 0;
int res= a.length ;//
for(int i=0;i<a.length;i++){
res ^=a[i]^i;
}
return res;
}
}
时间复杂度O(n)