【原地哈希】这个写的比较拉垮,因为一次交换之后还要再检查当前值是否在正确位置上,所以需要用一个while循环来确保把该有的数字都放在正确位置上了。
class Solution {
public int missingNumber(int[] nums) {
int n = nums.length;
for(var i = 0; i < n; i++){
while(nums[i] != i){
if(nums[i] == n) break;
else{
int idx = nums[i];
int t = nums[idx];
nums[idx] = idx;
nums[i] = t;
}
}
// for(var j: nums) System.out.print(j + " ");
// System.out.println();
}
// for(var i = 0; i < n; i++) System.out.print(nums[i] + " ");
// System.out.println();
for(var i = 0; i < n; i++){
if(nums[i] != i) return i;
}
return n;
}
}
【位运算】当前是0-n少一个,如果在来一遍0-n,那就是除了某个数其他都存在两次了,这样通过异或就能消除所有出现两次的数,剩下的结果就是出现一次的也就是缺少的。
class Solution {
public int missingNumber(int[] nums) {
int ans = 0, n = nums.length;
for(var i = 0; i <= n; i++) ans ^= i;
for(var i: nums) ans ^= i;
return ans;
}
}
【数学】哈哈哈其实知道了n那可以直接求和减去现有的数字就好了呀。
class Solution {
public int missingNumber(int[] nums) {
int n = nums.length;
int ans = (n + 1) * n >> 1;
int sum = 0;
for(var i: nums) sum += i;
return ans - sum;
}
}