leetcode第一刷_Single Number II

來源:互聯網
上載者:User

其他出現兩次,只有一個出現一次的那道題我就不更了,直接抑或,最後的結果就是那個數。為什麼可以這樣做呢?因為一個32位int,如果所有數都出現了兩次,那麼為1的那些位統計的個數一定是2的倍數,抑或之後全變成0。一個數出現了一次,它為1的那些位上,1的個數必定是奇數,抑或之後一定還是1。

我之前知道出現兩次這個題的解法,但是理解的不夠深,以為抑或是關鍵,其實不是,出現了偶數次才是關鍵。理解了這點,推廣到出現3次上,如果所有的出現了三次,那麼為1的那些位1的個數一定是三的倍數,那如果有一個數出現了一次呢?沒錯,它為1的那些以三餘模之後,肯定是1。換言之,出現幾次都可以用同樣的思想解,只不過如果這個重複次數不是偶數,就不能用抑或簡單的解決,而是一位一位的用一個量來儲存位元運算的結果,一看代碼就明白了。

還有一個有趣的問題,是劍指offer上的,如果一個數組中只有兩個數出現了一次,其他都出現了兩次,怎麼快速找出這兩個數呢?這次的關鍵是抑或操作。想想把數組抑或之後得到的結果是什麼呢?出現兩次的數都被自己抑或成了0,對,相當於這兩個出現了一次的數的抑或,他們抑或的結果是什麼呢?不同的位被置1,相同的位被置0。兩個數不同,所以至少有一位被置1了。我們可以根據這一位來分類,這一位為0的歸為一類,為1的歸為一類,這兩類分別抑或,得到的就是要求的那兩個數了。

最後還是貼上三次一個的代碼:

class Solution {public:    int singleNumber(int A[], int n) {        int res=0;        for(int i=0;i<32;i++){            int count = 0;            for(int j=0;j<n;j++){                count += (A[j]>>i)&1;            }            res |= ((count%3)<<i);        }        return res;    }};


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.