位運算 Leetcode 面試題與簡單題

2021-10-16 10:18:33 字數 3547 閱讀 4656

給定乙個包含 [0, n] 中 n 個數的陣列 nums ,找出 [0, n] 這個範圍內沒有出現在陣列中的那個數。

解法一:數學法,計算0到n的和,然後減去陣列中的值。當值為0,則缺失數字為n,當值不為0,就是其結果

解法二:位運算中的異或。不是要找缺失的數字嗎

0,1, 2, 3, 4, 5

0,1, 2, 4, 5

由於異或相同為0,不同為1。來兩次就可以找到不同的值

public

intmissingnumber

(int

nums)

return res^nums.length;

}

未知 整數陣列 arr 由 n 個非負整數組成。

經編碼後變為長度為 n - 1 的另乙個整數陣列 encoded ,其中 encoded[i] = arr[i] xor arr[i + 1] 。例如,arr = [1,0,2,1] 經編碼後得到 encoded = [1,2,3] 。

給你編碼後的陣列 encoded 和原陣列 arr 的第乙個元素 first(arr[0])。

請解碼返回原陣列 arr 。可以證明答案存在並且是唯一的。

解法:由於題目由異或得來,再異或回去一把就是原值

public

int[

]decode

(int

encoded,

int first)

return arr;

}

**

給定乙個整數,編寫乙個演算法將這個數轉換為十六進製制數。對於負整數,我們通常使用 補碼運算 方法。

解法:這題限制用api去解決問題,咱們只能手動來模擬

15與數字與得末尾,無符號右移4位,相當於除以16。

public string tohex

(int num)

return buffer.

reverse()

.tostring()

;}

給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。

解法:負數和0直接false,當1個數是2的冪次方, 100。。。000,減一為011。。。111.二者相與為0

public boolean ispoweroftwo

(int n)

給定兩個整型數字 n 與 m,以及表示位元位置的 i 與 j(i <= j,且從 0 位開始計算)。

編寫一種方法,使 m 對應的二進位制數字插入 n 對應的二進位制數字的第 i ~ j 位區域,不足之處用 0 補齊。

解法:題目意思很簡單,就是將中間的一塊換成給定的數字

1:讓i,j之間的二進位制為0001111000

2:取反得到i,j之外的二進位制數,中間i,j為0,其餘為1110000111

3:與數字n相與得.。。。0000。。。

4 :與m左移i位或運算得答案。。。***xx。。。

public

static

intinsertbits

(int n,

int m,

int i,

int j)

t =~t; t = t & n;

t = t |

(m << i)

;return t;

}

不使用運算子 + 和 - ​​​​​​​,計算兩整數 ​​​​​​​a 、b ​​​​​​​之和。

解法:a^b異或其實是無進製累加的和 a^b +

(a&b)

<<

11.兩個整數a, b; a ^ b是無進製的相加;

2.a&b得到每一位的進製,然後左移1位

3.讓無進製相加的結果與進製不斷的異或,直到進製為0;

public

intgetsum

(int a,

int b)

return a;

}

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

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

解法:由於異或的特性,相同為0,不同為1,所有找單個,異或解決。

public

intsinglenumber

(int

nums)

return res;

}

l

編寫乙個函式,輸入是乙個無符號整數(以二進位制串的形式),返回其二進位制表示式中數字位數為 『1』 的個數

解法:其實就是跟所在的1進行與運算,當不為0,則當前位為1;1左移i位得到i的位數為1

public

inthammingweight

(int n)

return count;

}

解法一:回溯加剪枝

解法二:直接暴力破解,用bitcount來統計1的個數即燈的個數。

public list

readbinarywatch

(int num)}}

return list;

}

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數 大於 ⌊ n/2 ⌋ 的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。

解法:同歸於盡

先當前的count是否為0,如果為0,將當前值當結果值用,count置1,不為0,相等加1,不等減一,最後得結果值

public

intmajorityelement

(int

nums)

else

}return k;

}

配對交換。編寫程式,交換某個整數的奇數字和偶數字,盡量使用較少的指令(也就是說,位0與位1交換,位2與位3交換,以此類推)。

解法:位運算,&運算取得奇數字,偶數字, 然後奇數字左移1位進行|運算,偶數字右移1位進行|運算

public

static

intexchangebits

(int num)

return res;

}

編寫乙個方法,找出兩個數字a和b中最大的那乙個。不得使用if-else或其他比較運算子。

解法:不能用比較值,那我就用(a+b+math.

abs(a-b))/

2,不過a+b或者a-b會溢位,加乙個

public

intmaximum

(int a,

int b)

a = a ^ b;

b = a ^ b;

a = a ^ b;

位運算面試題總結

題目鏈結 題目描述 給出兩個32位的整數n和m,以及兩個二進位制位的位置i和j。寫乙個方法來使得n中的第i到j位等於m m會是n中從第i為開始到第j位的子串 樣例n 10000000000 2,m 10101 2,i 2,j 6 返回n 10001010100 2class solution els...

位運算常見面試題

思路 兩個相同數異或結果為0 int a a b int b a b int a a b 思路 兩個相同數異或結果為0,讓陣列中所有的數字相異或,留下的結果即為出現 次的數字 int find one time number vector data return result 思路 兩個相同數異或結...

位運算面試題常用技巧

位運算是面試中的常見考題一種,位操作有 六種。左移和右移規則 對左移而言,移動正數和負數規則是相同的 對於右移而言,則有些差別,正數補0,負數補1。舉例說明 對於乙個16位的整數 0000 0000 0000 0101,左移一位是0000 0000 0000 1010,右移一位是0000 0000 ...