1、題目數組
一、審題spa
二、分析code
求出一個數組中連續的元素中缺失的那一個。blog
2、解答排序
一、思路class
方法1、方法
將數組中的元素與下標進行對應。最終與下標不一致的元素即爲缺失德那一個。im
public int missingNumber(int[] nums) { int end = nums.length - 1; for (int start = 0; start <= end; start++) { if(nums[start] > end || nums[start] == start) continue; int tmp = nums[start]; nums[start] = nums[tmp]; nums[tmp] = tmp; start--; } for (int start = 0; start <= end; start++) { if(nums[start] != start) return start; } return end + 1; }
方法2、sort
採用異或 ^ 運算符。將下標與元素值一塊兒作 ^ 操做。出現了兩次的元素最終會被消去,只剩下要求的出現一次的元素。img
public int missingNumber2(int[] nums) { int re = 0, i = 0; for (i = 0; i < nums.length; i++) re = re ^ i ^ nums[i]; return re ^ i; }
方法3、
採用求和方法。倘若元素所有連續,將他們求和後再減去出現的元素值,剩下的即爲未出現的元素值。
public int missingNumber3(int[] nums) { int len = nums.length; int sum = (0 + len) * (len + 1) / 2; for (int i = 0; i < len; i++) sum -= nums[i]; return sum; }
方法4、
先將數組排序,在採用二分法查找缺失德元素。排序後下標與元素值相等,則該元素及前部分都是完整的部分。若該元素與下標不對應,則缺失德元素在前部。
public int missingNumber4(int[] nums) { Arrays.sort(nums); int left = 0, right = nums.length, mid = (left + right) / 2; while(left < right) { mid = (left + right )/ 2; if(nums[mid] > mid) right = mid; else left = mid + 1; } return left; }