原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnj4mt/
解法一:
class Solution {
public int missingNumber(int[] nums) {
int result = 0;
for (int i = 0 ; i < nums.length; i++) {
result ^= nums[i] ^ (i+1);
}
return result;
}
}
思路:
a^a=0;自己和自己异或等于0
a^0=a;任何数字和0异或还等于他自己
a^b^c=a^c^b;异或运算具有交换律
从题目中我们知道,数组中有n个数,但我们需要知道从0到n数个,也就是少的哪一个数是谁?
异或运算求解,我们把一个数组将本身异或运算,得到的结果一定是0,如果其中少了一位数,那么异或后的结果必定是少的那位数。
解法二:
class Solution {
public int missingNumber(int[] nums) {
int length = nums.length;
int sum = (0+length)*(length+1)/2;
for (int i = 0 ; i < length; i++) {
sum -= nums[i];
}
return sum;
}
}
思路:
我们可以直接通过等差数列的求和公式,计算0到n的和,然后用和减去数组中的每一项,最后的结果就是,数组缺失的那一个数字。
总结:初级的leecode练习就结束了,接下来就是复习软考相关的内容,特此纪念,2022-10-13。
2024-05-28 start:
解法三(rust):
impl Solution {
pub fn missing_number(nums: Vec<i32>) -> i32 {
let len = nums.len() as i32;
let expected_sum = (0..=len).sum::<i32>(); // 计算期望的和
let actual_sum: i32 = nums.iter().sum(); // 计算数组中的和
// 缺失的数就是期望的和减去数组中的和
expected_sum - actual_sum
}
}
思路:同解法二
end