publicintrangeBitwiseAnd(int m, int n){ // 统计m和n的高位相等的个数 int counter = 0; while (m != n){ m = m >> 1; n = n >> 1; ++counter; } // 将m左移counter次就是结果 return m << counter; }
Single Number
给一个数组,数组中只有一个元素是单个出现的,其它都是成对出现。找到这个元素。
思路:由于x ^ 0 = x, x ^ x = 0 , 因此 x ^ x ^ y ^ z ^ z = y
1 2 3 4 5 6 7 8 9 10
publicintsingleNumber(int[] nums){ if (nums == null || nums.length == 0) { return Integer.MIN_VALUE; } int res = nums[0]; for (int i = 1; i < nums.length; i++) { res ^= nums[i]; } return res; }
Reverse Bits
将无符号整数按位反转。
1 2 3 4 5 6 7 8 9
publicintreverseBits(int n){ int result = 0; for(int i = 0; i < 32; ++i) { // 注意:这里不可以用 n > 0的判断!因为是无符号的! result <<= 1; result += (n & 1); // n & 1 == n % 2 n >>= 1; } return result; }
Number of 1 Bits
求一个无符号整数的1bit的个数
1 2 3 4 5 6 7 8
publicinthammingWeight(int n){ int counter = 0; for(int i = 0; i < 32; ++i){ counter += (n & 1); n >>= 1; } return counter; }
Maximum Product of Word Lengths
给一些str。求两个没有共有字母的word的长度乘积的最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicintmaxProduct(String[] words){ int[] bitCount = newint[words.length]; for(int i = 0; i < words.length; ++i){ for(char c : words[i].toCharArray()){ bitCount[i] |= (1 << (c-'a')); // 将第c-'a'位 置为1 } } int max = 0; for(int i = 0; i < words.length; ++i){ for(int j = i + 1; j < words.length; ++j){ if((bitCount[i] & bitCount[j]) == 0){ // 如果word[i]和word[j]的与为0,则说明没有共有的字母 max = Math.max(words[i].length() * words[j].length(), max); } } } return max; }