消失的数字

欢迎访问我的blog http://www.codinglemon.cn/

面试题 17.04. 消失的数字

1. 题目描述

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

示例 1:

输入:[3,0,1]
输出:2

示例 2:

输入:[9,6,4,2,3,5,7,0,1]
输出:8

2. 解题代码

2.1 类暴力破解

我首先想到的方法是新创建一个boolean类型的数组tempArr,且数组长度为传入nums数组的长度再加1(因为nums数组缺了一个数),然后遍历nums数组,讲nums的每个元素的值作为tempArr数组的下标,修改该下标对应元素的值为true。遍历nums数组结束后,那么只会有缺失的那个数字作为tempArr的下标对应的元素的值为false,遍历tempArr,找出值为false的那个元素的下标,即为缺失的元素。

class Solution {
    
    
    public int missingNumber(int[] nums) {
    
    
        int numLength = nums.length;
        boolean[] tempArr = new boolean[numLength+1];
        for(int i =0;i< numLength;i++){
    
    
            tempArr[nums[i]] = true; 
        }

        for(int i=0;i< tempArr.length;i++){
    
    
            if(!tempArr[i]){
    
    
                return i;
            }
        }
        return -1;
    }
}

此时执行时间和占用内存为:

image.png

特别是对于内存消耗来说不是很理想,毕竟创建了临时数组。

2.2 求和再相减

既然整个数组中的元素都小于等于数组长度加1的值,那么定义临时变量sum,遍历nums数组,使得sum = sum + i - nums[i],这样遍历完nums数组后,sum的值即为缺失的那个值。代码如下:

class Solution {
    
    
    public int missingNumber(int[] nums) {
    
    
        int numLength = nums.length;
        int sum = numLength;
        for(int i =0;i< numLength;i++){
    
    
            sum = sum + i-nums[i];
        }

        return sum;
    }
}

执行时间和占用内存如下:

image.png

另外还有一种解法是用位运算,还未太理解…

猜你喜欢

转载自blog.csdn.net/zry15671554200/article/details/114899955