136. 只出現(xiàn)一次的數(shù)字

一、題目原型:

給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素

二、題目意思剖析:

說(shuō)明:
你的算法應(yīng)該具有線性時(shí)間復(fù)雜度。 你可以不使用額外空間來(lái)實(shí)現(xiàn)嗎?
示例 1:
輸入: [2,2,1]
輸出: 1

示例 2:
輸入: [4,1,2,1,2]
輸出: 4

三、解題思路:

第一種

根據(jù)題目意思,數(shù)組的個(gè)數(shù)一定是奇數(shù)。(2+2+2+1+2)類(lèi)似這樣,先排個(gè)序,然后 i = i + 2,一旦前后不同,就return前面那個(gè)數(shù)字。

func singleNumber(_ nums: [Int]) -> Int {
    
    if nums.count == 1 {
        return nums.first!
    }
    
    // 0 0 1 1 2 3 3
    // 除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次 
    // 說(shuō)明數(shù)組個(gè)數(shù)一定是奇數(shù)
    var mutnums = nums.sorted()
    var index: Int = 0
    while index < mutnums.count {
        //print(index)
        if index+1 >= mutnums.count {
            return mutnums[index]
        }
        //上面代碼已經(jīng)屏蔽掉了index+1越界的情況
        if mutnums[index] != mutnums[index+1] {
            return mutnums[index]
        }
        index = index + 2
    }
    //print(mutnums)
    return -1
}
第二種:異或法

找到數(shù)組里唯一不同的那個(gè)數(shù)字,其實(shí)可以用異或法
兩個(gè)相同數(shù)字 異或所得到的是0,可以測(cè)試下。

{
    var temp: Int = 2
    temp ^= 2
    print(temp)
}
打印的temp = 0

0異或任何數(shù)字,都等于原數(shù)字本身

{
    var temp: Int = 0
    temp ^= 2
    print(temp)
}
打印的temp = 2
原理:

假設(shè)如果 A = 60,且 B = 13,現(xiàn)在以二進(jìn)制格式表示,它們?nèi)缦滤荆?/p>

A = 0011 1100
B = 0000 1101


A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A = 1100 0011

& 兩者同時(shí)為真才為真;| 兩者一者為真就為真;^相同為假,不同為真

所以,我們只要用0去異或數(shù)組里所有的數(shù)字,最后得到的就是不同的那個(gè)數(shù)字。

func singleNumber(_ nums: [Int]) -> Int {
    if nums.count == 1 {
        return nums.first!
    }
    // 異或
    var temp: Int = 0
    for num in nums {
        temp ^= num
    }
    return temp
}

四、小結(jié)

第一種方法耗時(shí) 144ms,超過(guò)19.02%提交記錄。
第二種方法耗時(shí) 32ms,超過(guò)68.1%提交記錄。
總提交數(shù):16。
個(gè)人博客地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 給定一個(gè)整數(shù)數(shù)組,除了某個(gè)元素外其余元素均出現(xiàn)兩次。請(qǐng)找出這個(gè)只出現(xiàn)一次的元素。 備注: 你的算法應(yīng)該是一個(gè)線性時(shí)...
    WindMajor閱讀 3,520評(píng)論 0 3
  • 給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素。 說(shuō)明:你的...
    二木二三水閱讀 370評(píng)論 0 1
  • 給定一個(gè)整數(shù)數(shù)組,除了某個(gè)元素外其余元素均出現(xiàn)兩次。請(qǐng)找出這個(gè)只出現(xiàn)一次的元素。 備注: 你的算法應(yīng)該是一個(gè)線性時(shí)...
    拉面小魚(yú)丸閱讀 292評(píng)論 0 0
  • 給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素。說(shuō)明:你的算...
    vbuer閱讀 138評(píng)論 0 0
  • 1.小白,解決有沒(méi)有倉(cāng)位、倉(cāng)位上升速度問(wèn)題。選擇高成長(zhǎng)區(qū)域,低資金高杠桿,快速滾動(dòng)。大概能沖擊1-2kw。 2.中...
    鄭州投資俱樂(lè)部sk閱讀 183評(píng)論 0 0

友情鏈接更多精彩內(nèi)容