原题链接:https://leetcode.com/problems/missing-number/description/
只想说位操作里面的异或很牛逼,官方答案里面也有惊喜:
import java.util.Arrays;
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.missingNumber(new int[]{3, 0, 1}));
System.out.println(s.missingNumber(new int[]{9, 6, 4, 2, 3, 5, 7, 0, 1}));
}
/**
* 方法一:先排序,再查找缺失的数字。提交结果:17.21 %
*
* 时间复杂度:O(nlogn)
* 空间复杂度:O(1)
*
* @param nums
* @return
*/
public int missingNumber1(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
Arrays.sort(nums);
int i;
for (i = 0; i < nums.length; i++) {
if (nums[i] != i) {
return i;
}
}
return i;
}
/**
* 方法二:这个方法是看了 Related Topics 中提到了 Bit Manipulation 才想起来的,??哈哈异或操作真是神操作啊。提交结果:100 %
*
* 时间复杂度:O(n)
* 空间复杂度:O(1)
*
* @param nums
* @return
*/
public int missingNumber(int[] nums) {
if (nums == null) {
return -1;
}
int res = 0, i = 0;
for (; i < nums.length; i++) {
res ^= nums[i];
res ^= i;
}
res ^= i;
if (res == 0) { // res == 0 即可能是因为数组 nums 中缺了一个 i,也可能是数组 nums 中缺了一个 0
for (int j = 0; j < nums.length; j++) {
if (nums[j] == 0) {
return i;
}
}
return 0;
} else {
return res;
}
}
// 官方答案一:就是我的方法一
// 官方答案二:使用哈希表来解决,我也想到了这个方法,懒得写的
// 官方答案三:就是我的方法二了,不过代码简洁方便确实比我的高出好多倍呢
// 官方答案四:我曹,这方法老牛逼了,竟然能用上高斯求和的故事来解决,我服??
}