給定乙個包含 [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 ...