真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

LeetCode如何計(jì)算數(shù)組中數(shù)字出現(xiàn)的次數(shù)

這篇文章將為大家詳細(xì)講解有關(guān)LeetCode如何計(jì)算數(shù)組中數(shù)字出現(xiàn)的次數(shù),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。        

從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。

題目描述

一個(gè)整型數(shù)組 nums 里除兩個(gè)數(shù)字之外,其他數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個(gè)只出現(xiàn)一次的數(shù)字。要求時(shí)間復(fù)雜度是 O(n),空間復(fù)雜度是 O(1)。

  • 2 <= nums.length <= 10000
                     

題目樣例          

示例

  • 輸入:nums = [4,1,4,6]

  • 輸出:[1,6] 或 [6,1]

  • 輸入:nums = [1,2,10,4,1,4,3,3]

  • 輸出:[2,10] 或 [10,2]

                     

題目思考

  1. 如果其他數(shù)字都出現(xiàn)兩次, 只有一個(gè)數(shù)字出現(xiàn)一次如何解決?
  2. 如何做到空間復(fù)雜度是 O(1)?
                     

解決方案

                     
思路
  • 分析題目, 相信大家都能想到計(jì)數(shù)字典的方案, 就是記錄每個(gè)數(shù)字的次數(shù), 然后找次數(shù)為 1 的數(shù)字, 但這樣空間復(fù)雜度為 O(N), 不滿足要求
  • 我們先來分析一個(gè)簡化問題:                          如果其他數(shù)字都出現(xiàn)兩次, 只有一個(gè)數(shù)字出現(xiàn)一次如何解決?
    • 這個(gè)問題估計(jì)不少同學(xué)都見過, 一個(gè)很巧妙的做法是                           異或所有數(shù)字, 因?yàn)閮蓚€(gè)相同數(shù)字的異或結(jié)果一定為 0, 所以最終異或的結(jié)果一定是那個(gè)出現(xiàn)一次的數(shù)字
  • 那針對(duì)這道題, 還可以利用異或思路嗎?
  • 答案是肯定的, 假設(shè)我們還是異或所有數(shù)字, 那么                          最終異或出來的值等價(jià)于那兩個(gè)出現(xiàn)一次的數(shù)字的異或結(jié)果, 因?yàn)槠渌霈F(xiàn)兩次的數(shù)字異或都是 0, 對(duì)最終異或結(jié)果沒有影響.
  • 而異或結(jié)果中的某一位 1, 代表這兩個(gè)數(shù)字在這一位上的取值不同, 一個(gè)是 0, 一個(gè)是 1
  • 我們可以利用這一點(diǎn),                          將原數(shù)組分為兩類, 一類是該位為 1 的, 一類是該位為 0 的. 對(duì)于出現(xiàn)兩次的數(shù)字而言, 它們肯定落在同一類里面; 而對(duì)于這兩個(gè)出現(xiàn)一次的數(shù)字, 它們被分屬在兩個(gè)不同類中.
  • 這樣問題就轉(zhuǎn)換成了上面描述的簡化問題, 只需要對(duì)這兩類分別求出它們的異或結(jié)果, 自然就是對(duì)應(yīng)兩個(gè)出現(xiàn)一次的數(shù)字了~
  • 最后一個(gè)問題: 如何求異或結(jié)果 xor 的某一位 1 呢?
    • 我們可以利用循環(huán), mask 從 1 開始, 判斷 xor 的這一位是否為 1, 是的話就跳出循環(huán), 否則 mask 左移一位, 直到超出 xor
    • 當(dāng)然還有更簡單的做法, 利用樹狀數(shù)組的 lowbit, 也即                           xor & -xor, 直接就能求得最低位的 1 對(duì)應(yīng)的數(shù)字, 這個(gè)大家手動(dòng)模擬下補(bǔ)碼就知道是為什么了
  • 下面代碼對(duì)必要的步驟有詳細(xì)的解釋, 方便大家理解
                     
復(fù)雜度
  • 時(shí)間復(fù)雜度 O(N): 遍歷兩遍數(shù)組
  • 空間復(fù)雜度 O(1): 只使用了幾個(gè)變量
                     
代碼
class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        # 先拿到所有數(shù)字的異或結(jié)果, 該結(jié)果一定至少有一位是1, 否則就不可能有兩個(gè)出現(xiàn)一次的數(shù)字
        xor = 0
        for n in nums:
            xor ^= n
        # 然后隨便針對(duì)異或結(jié)果的某一位1, 將原數(shù)組分為兩類, 自然兩個(gè)出現(xiàn)一次的數(shù)字就會(huì)分別落在不同類里面, 否則其異或結(jié)果的這一位不可能是1
        # 這里直接利用樹狀數(shù)組的lowbit(即原來的數(shù)字的最低位的1)
        mask = xor & -xor
        a, b = 0, 0
        for n in nums:
            if n & mask:
                # 如果數(shù)字的這一位是1, 歸為一類, 求它們的異或值, 即為其中一個(gè)出現(xiàn)一次的數(shù)
                a ^= n
            else:
                # 如果數(shù)字的這一位是0, 歸為另一類, 求它們的異或值, 即為另一個(gè)出現(xiàn)一次的數(shù)
                b ^= n
        return [a, b]
                                             

關(guān)于“LeetCode如何計(jì)算數(shù)組中數(shù)字出現(xiàn)的次數(shù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。


網(wǎng)頁名稱:LeetCode如何計(jì)算數(shù)組中數(shù)字出現(xiàn)的次數(shù)
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/jgsgde.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部