LeetCode——位运算
常用技巧:
(1)n & (n-1) 可以去除n的位级表示中最低的那一位
(2)n & -n可以得到n的位级表示中最低的那一位
T461 汉明距离
class Solution {
public int hammingDistance(int x, int y) {
int out = 0;
int res = x ^ y;
while(res != 0){
out += res & 1;
res >>= 1;
}
return out;
}
}
T190 颠倒二进制位
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
int out = 0;
for(int i = 0; i < 32 && n != 0; i++){
out |= (n & 1) << (31 - i);
n >>>= 1;
}
return out;
}
}
T136 只出现一次的数字
class Solution {
public int singleNumber(int[] nums) {
int out = 0;
for(int i = 0; i < nums.length; i++){
out ^= nums[i];
}
return out;
}
}
T342 4的幂
class Solution {
public boolean isPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
}
}
T318 最大单词长度乘积
class Solution {
public int maxProduct(String[] words) {
int max = 0;
int[] mask = new int[words.length];
int[] length = new int[words.length];
int bitMask = 0;
for(int i = 0; i < words.length; i++){
bitMask = 0;
for(char c : words[i].toCharArray()){
bitMask |= 1 << ((int)c - (int)'a');
length[i]++;
}
mask[i] = bitMask;
}
for(int i = 0; i < words.length; i++){
for(int j = i+1; j < words.length; j++){
if((mask[i] & mask[j]) == 0){
max = Math.max(max, length[i] * length[j]);
}
}
}
return max;
}
}
T338 比特位计数
class Solution {
public int[] countBits(int n) {
int[] out = new int[n+1];
int res = 0;
for(int i = 1; i <= n; i++){
if((i & 1) == 1){
out[i] = out[i-1] + 1;
}
else{
out[i] = out[i >> 1];
}
}
return out;
}
}
T268 丢失的数字
class Solution {
public int missingNumber(int[] nums) {
int out = nums.length;
for(int i = 0; i < nums.length; i++){
out ^= i ^ nums[i];
}
return out;
}
}
T693 交替位二进制数
class Solution {
public boolean hasAlternatingBits(int n) {
int flag = 2;
while(n != 0){
if((n & 1) == 1){
if(flag == 1){
return false;
}
flag = 1;
}
else{
if(flag == 0){
return false;
}
flag = 0;
}
n >>>= 1;
}
return true;
}
}
T476 数字的补数
class Solution {
public int findComplement(int num) {
int mask = -1; // 0xFFFFFFFF 即全为1 补码存的!
while ((mask & num) > 0) {
mask <<= 1;
}
return ~mask ^ num;
}
}
T260 只出现一次的数字
class Solution {
public int[] singleNumber(int[] nums) {
int res = 0;
for(int num : nums){
res ^= num;
}
int div = 1;
while((res & div) == 0){
div <<= 1;
}
int a = 0;
int b = 0;
for(int num : nums){
if((num & div) != 0){
a ^= num;
}
else{
b ^= num;
}
}
return new int[]{a, b};
}
}
T231 2的幂
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n-1)) == 0;
}
}
T371 两整数之和
class Solution {
public int getSum(int a, int b) {
int temp = 0;
while(b != 0){
temp = a ^ b;
b = (a & b) << 1;
a = temp;
}
return a;
}
}