牛客网、缺失数字

题目描述(简单题)

在这里插入图片描述

解法

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)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/114934166