最近在看算法題,其中比較有意思的一道:
問題描述:給定一個有n個不同數字,是0-n,其中有一個數字是缺少的,找出這個數字,最好是線性的時間結構,不使用額外的內存空間
思路1.算出這n個數字之和,與0-n這n+1個數字之和進行比較,缺少的數字就是2個數字之差
思路2.對數組進行排序,然后使用二分法進行查找
思路3.首先我們知道,n^m^n = m 那么,(0^1^2^3...^n) ^ (0^1^2^3...^n) 前半部分為0-n的n+1個數字,后半部分為題中給出的數組,這樣就可以求出那個單獨的數字
以下為代碼的實現,供大家參考,着重理解解題的思路
1 package com.xiong.test; 2 3 import java.util.Arrays; 4 5 public class MissingNum { 6 7 /*** 8 * Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, 9 * find the one that is missing from the array. 10 * Input: [3,0,1] 11 * Output: 2 12 * 13 * 思路1.算出數組的和,可以找出缺少的那個 14 * 思路2.排序后二分法查找 15 * 思路3.與法 16 */ 17 //first 18 public static int missingNumber(int[] nums) { 19 Arrays.sort(nums); 20 int low = 0, high = nums.length; 21 while (low <= high) { 22 int mid = (low + high)/2; 23 if (nums[mid] > mid) { 24 high = mid - 1; 25 } else { 26 low = mid + 1; 27 } 28 } 29 return low; 30 } 31 //和法 32 public static int missingNumber2(int[] nums) { 33 int res = (nums.length) * (nums.length + 1)/2; 34 int sum = 0; 35 for (int i = 0; i < nums.length; i++) { 36 sum += nums[i]; 37 } 38 return res - sum; 39 } 40 //與法 41 public static int missingNumber3(int[] nums) { 42 int res = nums.length; 43 for (int i = 0; i < nums.length; i++) { 44 res ^= nums[i]; 45 res ^= i; 46 } 47 return res; 48 } 49 50 public static void main(String[] args) { 51 int[] nums = {9,6,4,2,8,5,7,0,1}; 52 System.out.println(missingNumber3(nums)); 53 System.out.println(missingNumber2(nums)); 54 System.out.println(missingNumber(nums)); 55 } 56 57 }
如果有什么問題希望大家批評指正,謝謝