位运算

Java中的位操作

static int Integer.bitCount();           // 统计 1 的数量
static int Integer.highestOneBit();      // 获得最高位
static String toBinaryString(int i);     // 转换为二进制表示的字符串

  列出两个比较使用位运算比较经典的题目(如下)

LeetCode260--数组中不重复的两个元素

  两个不相等的元素在位级表示上必定会有一位存在不同。

  将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。

  cur&= -cur得到出 cur 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。

class Solution {
    public int[] singleNumber(int[] nums) {
        int[] res = new int[2];
        int cur = 0;
        for(int num : nums) {
            cur ^= num;
        }
        cur &= -cur;
        for(int num : nums) {
            if((cur & num) == 0) res[0] ^= num;
            else res[1] ^= num;
        }
        return res;
    }
}

LeetCode318--最大单词长度乘积

  因为本题目中只有26个字母,而int的二进制是32位的,所以可以使用int来表示。

  使用&,如果两个字符串没有相同的字母时,words[i] & words[j] = 0

class Solution {
    public int maxProduct(String[] words) {
        int n =words.length;
        int[] nums = new int[n];
        int[] len = new int[n];
        for(int i = 0; i < n; i++) {
            len[i] = words[i].length();
        }
        for(int i = 0; i < n; i++) {
            int k = 0;
            for(char ch : words[i].toCharArray()) {
                k |= 1 << (ch - 'a');
            }
            nums[i] = k;
        }
        int maxx = 0;
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n; j++) {
                if((nums[i] & nums[j]) == 0) {
                    maxx = Math.max(maxx, len[i] * len[j]);
                }
            }
        }
        return maxx;
    }
}

 

posted @ 2022-05-09 18:39  小白的学习  阅读(36)  评论(0)    收藏  举报