找出缺失的數字


最近在看算法題,其中比較有意思的一道:

問題描述:給定一個有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 }

 

     如果有什么問題希望大家批評指正,謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM