雖然要求不開闢額外空間與o(n)的時間複雜度, 單由於資料比較水. 靠排序依然能過, 所以花了點時間想了想
數字去重, 時間複雜度o(n)且不開闢額外空間, 那麼就該從位運算入手了
某個元素只出現一次, 其餘每個元素出現3個, 則把每乙個數字拆分為二進位制, 經過拆分求和之後每一位上只有3x
或3x + 1
, 經過%3
後就完成了去重工作
由此題意變成, 通過位運算設計加法器
與%3
操作的數位電路
由於最大數字為3
, 至少需要2bit
才能實現運算
設運算數的低位為a
, 高位為b
, 輸入為v
每次計算結束時低位為an
, 高位為bn
位運算符號使用c語言版本
至於具體設計, 就自由發揮了
以下示意圖均為隨手瞎畫, 沒有遵循任何數字電路圖規範_(:з」∠)_
方法一方法二
方法三由於an
的推導基本是一樣的, 這裡只列出an
部分的推導
將圖轉化為等式
c = a ^ v
d = a & v
e = b | d
f = c ^ e
an = c & f
bn = e & f
an = c & f
= c & (c^e)
= c & (~e)
= c & (~(b|d))
= (a^v) & (~b) & (~d)
= (a^v) & (~b) & (~(a&v))
= (a^v) & (~b) & (a|v)
= (a^v) & (~b)
int singlenumber(int* nums, int numssize)
return a;
}
Leetcode137 只出現一次的數字
題目描述 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,3,2 輸出 3 示例 2 輸入 0,1,0,1,0,1,99 輸出 99 思路 對數字中數...
leetcode 137 只出現一次的數字 II
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?這種純數字計算的問題,如果我們只用加減乘除就能做出來,那leetcode就太low了,這種問題,應該深入到位級別運算。思考,將...
leetcode137 只出現一次的數字詳解
原題連線 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,3,2 輸出 3 示例 2 輸入 0,1,0,1,0,1,99 輸出 99 3 函式f實現的...