二進位制 leetcode

2021-10-08 02:24:29 字數 3173 閱讀 8017

5@toc

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

class

solution

return result;}}

;

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

思路: 某一位上1出現的次數除以三的餘數一定是1或者0;

class

solution

cout<<

"i"<"sum"

=(sum%3)

<}return result;}}

;

class

solution

for(i=

0;i<

32;i++)}

for(

int e: nums)

else

} result.

push_back

(tmp_result1)

; result.

push_back

(tmp_result2)

;return result;}}

;

給定乙個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

思路: 利用二叉樹的層次遍歷,左兒子位元數不變,右兒子位元數加一。

class

solution

while

(!que.

empty()

)else

}return result;}}

;

給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。

思路: 轉換為求最長公共字首,因為某一位上不同的話後一位肯定不同

class

solution

}return tmp1<;

乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。

示例 1:

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

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

示例 2:

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

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

限制:

2 <= nums.length <= 10000
思路: 假設那兩個數為a,b,異或和為x。所有數字異或和等於x,找到x中為1的那一位index,說明在index位上a,b不同。把所有數字按照index位分為兩組,就轉換成兩個在一組數字中求乙個特殊數字的問題。

class

solution

for(index=

0;index<

32;index++)}

for(

int i=

0;i)else

} result.

push_back

(a);

result.

push_back

(b);

return result;}}

;

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數 dividend 除以除數 divisor 得到的商。

整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

輸入: dividend = 10, divisor = 3

輸出: 3

解釋: 10/3 = truncate(3.33333…) = truncate(3) = 3

示例 2:

輸入: dividend = 7, divisor = -3

輸出: -2

解釋: 7/-3 = truncate(-2.33333…) = -2

被除數和除數均為 32 位有符號整數。

除數不為 0。

假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。本題中,如果除法結果溢位,則返回 231 − 1。

思路: 使用原碼除法,要把每個負數轉為正數,使用int表示數時,而-int_min會溢位,所以改用long。

使用補碼除法雖然不用把負數轉成正數,但是求餘數時可能涉及int_min的減法,所以還是要用long。

class

solution

bool flag2=divisor>0;

long divisorlong=divisor;if(

!flag2)

if(dividendlong==

0|| divisorlong>dividendlong)

bool flag=!(

(flag1)

^(flag2));

int znum1=

0,znum2=0;

unsigned

int t=

1<<31;

while

(true

)else

} t=

1<<31;

while

(true

)else

}long result=0;

long level=znum2-znum1;

long r=dividendlong;

long y=divisorlong

for(

;level>=

0;level--

)else}if

(!flag)

if(resultif(result>int_max)

cout<<

1-int_min;

return result;}}

;

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

LeetCode 二進位制手錶

二進位制手錶頂部有 4 個 led 代表小時 0 11 底部的 6 個 led 代表分鐘 0 59 每個 led 代表乙個 0 或 1,最低位在右側。例如,上面的二進位制手錶讀取 3 25 給定乙個非負整數 n 代表當前 led 亮著的數量,返回所有可能的時間。案例 輸入 n 1 返回 1 00 2...

二進位制手錶(LeetCode)

二進位制手錶頂部有 4 個 led 代表小時 0 11 底部的 6 個 led 代表分鐘 0 59 每個 led 代表乙個 0 或 1,最低位在右側。例如,上面的二進位制手錶讀取 3 25 給定乙個非負整數 n 代表當前 led 亮著的數量,返回所有可能的時間。案例 輸入 n 1 返回 1 00 2...