1. 程式人生 > >陣列中只出現一次的數

陣列中只出現一次的數

1、一個整型數組裡只有一個數字出現了一次,其餘數字都出現了兩次,請寫程式找出出現了一次的數字。

思路:XOR位運算,相同數字XOR為0,任何數字與零XOR為自己。此題陣列一遍XOR就能找到出現一次的數

    public int arrayXOR(int[] arr) {
        int temp = 0;
        for (int i = 0; i < arr.length; i++) {
            temp ^= arr[i];
        }
        return temp;
    }

2、一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次,請寫程式找出這兩個只出現一次的數字。如:{1,2,1,2,3,4},找出3和4。

第一步,將陣列中所有數字異或一遍,得到的結果為兩個只出現一次的數字的異或結果。
本題:
0011(3)^(0100)4 = 0111(7) 括號內為十進位制

第二步,在第一步得到的數字的二進位制中找出第一個為1的位,通過這個位為0或為1,將陣列中的數字分為兩組。這兩個組裡出現一次的兩個數必定不在同一組,兩個相同的數字必定會被分在一個組。
本題:
0111最低位就為1,將陣列中最低位為1的放在一組,為0的放在另一組,則3和4必定不在同一組,因為找出的這 個位為1,即3和4 的這一位不同。則一組為:1,1,3 二組:2,2,4

第三步,將兩個組中的所有數字分別異或,就會得到每個組中只出現一次的那個數。(思路同第一題)
本題:
1^1^3 = 3,2^2^4 = 4,所以就找到了只出現了一次的兩個數。

    public void getTwoNum(int[] arr, int a) {
        // 第一次XOR
        int a = arrayXOR(arr);
        // 找出分組位“1”
        int k = 0;
        while ((a & 1) != 1) {
            a >>= 1;
            k++;
        }
        // 分組執行第一題的思路,即第二次XOR
        int t1 = 0, t2 = 0;
        int mod = 1 << k;
        for
(int i = 0; i < arr.length; i++) { if ((arr[i] & mod) != 0) { t1 ^= arr[i]; } if ((arr[i] & mod) == 0) { t2 ^= arr[i]; } } System.out.println(t1); System.out.println(t2); }

相關推薦

劍指offer之陣列出現次的數字

1.題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 2.問題分析 方法一: 可以使用map,統計每個數出現的次數,之後對兩個出現一次的數進行賦值 方法二: 這裡就數字的特性,首先我們需要知

牛客網——陣列出現次的數字

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 1實在沒想到什麼好的解決方法,就用TreeSet解決,因為底層是紅黑樹實現,增加,刪除結點是logn,所以複雜度為O(nlogn) package 劍指offer;

陣列出現次的數字 java

陣列中只出現一次的數字 java 題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 程式碼1: //num1,num2分別為長度為1的陣列。傳出引數 //將num1[0],num2[0]設定為返回結果 i

劍指offer:(40)知識遷移 :陣列出現次的數字

一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。 思路:    可以用位運算實現,如果將所有所有數字相異或,則最後的結果肯定是那兩個只出現一次的數字異或 的結果,所以根據異或的結果1所在的最低位,把數字分成兩半,每一半

劍指offer系列(十四)二叉樹的深度,平衡二叉樹,陣列出現次的數字

二叉樹的深度 題目描述 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 解題思路: 利用遞迴實現。如果一棵樹只有一個結點,那麼它的深度為1。遞迴的時候無需判斷左右子樹是否存在,因為如果該節點 為葉節點,它的左右

劍指offer——(7)二進位制1的個數&&陣列出現次的兩個數字

位操作符簡單記憶: &(與):相同位同為1時結果為1 否則為0 |(或):相同位同為0時結果為0 否則為1 ^(異或):相同位相同結果為0 不同為1 ~(取反):0變成1 1變成0 m>>(右移)n:m的各二進位全部右移n位,低位丟

【Java】 劍指offer(56-2) 陣列唯一隻出現次的數字 《劍指Offer》Java實現合集 56-1) 陣列出現次的兩個數字 《劍指Offer》Java實現合集

  本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目   在一個數組中除了一個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。 思路   這道題中數字出現了三次,無法像56-1) 陣列

劍指offer 40. 陣列出現次的數字

原題 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 Reference Answer 思路分析 直接利用python中的dict進行次數統計就好了,用空間換時間。 # -*- coding:utf-8 -*- class

劍指offer_陣列出現次的數字

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 # -*- coding:utf-8 -*- class Solution:     # 返回[a,b] 其中ab是出現一次的兩個數字   &n

《劍指offer》系列 陣列出現次的數字(Java)

連結 牛客:陣列中只出現一次的數字 題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 思路 參考:陣列中只出現一次的數 我們從頭到位對陣列做異或運算,得到的最終結果應該是兩個不同數字做異或運算後的值。因為兩個數字

T38:陣列出現次的數

1.https://blog.csdn.net/blubluhao/article/details/79846042 2.https://blog.csdn.net/blubluhao/article/details/79846042 import java.util.HashSet; im

劍指offer第四十題:陣列出現次的數字

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 思路1:先排序,然後遍歷整個陣列,如果當前數和前邊的數以及後邊的數都不一樣,那麼當前數就是隻出現了一次的數字,注意考慮邊界(只出現一次的數可能在陣列第一個也可能出現在

劍指Offer-56 陣列出現次的兩個數字

題目: 一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。你可以假設這兩個數字一定存在。 樣例 輸入:[1,2,3,3,4,4] 輸出:[1,2] 解答: class Solution(object): def findNumsAppe

面試題56-題目陣列出現次的兩個數字

/*  * 面試題56-題目一:陣列中只出現一次的兩個數字  * 題目:一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。  * 思路:異或運算,  * 我們想到了異或運算的性質:任何一個數字異或它自己都等於0。  *

劍指offer----陣列出現次的數字

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 //所有數字異或,最後得到的是兩個只出現一次的數字異或的結果,從低位到高位 //找到第一異或為1的位,記下來,根據這個位,將原來的陣列分做兩部分,可解 cl

陣列出現次的數字

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 解題思路: 利用LIst contains() 方法判斷原有list 陣列中是否存在相同的值 ,若存在則移除,最後list陣列剩下的即為兩個只出現一次的數字

【劍指offer】陣列出現次的數字

remove:刪除特定元素第一次出現的時候,返回的是刪除後的陣列 del:刪除指定索引的元素 del a[2],返回的是刪除後的陣列 pop:刪除指定索引的元素,返回的是刪除的元素 有一個問題就是我不知道判斷not in list 的時候O(n)的複雜度會不會影響 執

劍指offer-陣列出現次的數字(陣列

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。 這題想到用map,類似於“陣列中出現次數超過一半的陣列”https://blog.csdn.net/Mr_xuexi/article/details/84555464 其中,data

劍指offer-41:陣列出現次的數字和為S的連續正數序列

題目描述 小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你

劍指offer-40:陣列出現次的數字

題目描述 一個整型數組裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。時間複雜度O(N),空間複雜度O(1)。 思路 這個題目的突破口在哪裡?題目為什麼要強調有一個數字出現一次,其他的出現兩次?我們想到了異或運算的性質:任何一個數字異或它自己都等