位运算

汉明距离

方法1:数组

public boolean isUnique(String astr) {
    char[] ch = new char[26];
    for (char c : astr.toCharArray()) {
        if (ch[c - 'a'] != 0) return false;
        ch[c - 'a']++;
    }
    return true;
}

方法2:位运算

延伸阅读:位运算操作常见技巧

方法1:基本位运算

方法2:高阶位运算

方法3:库函数

方法1:模拟

  • 数据范围不大,模拟即可,两步走,

    • step1.统计每一个数二进制数中1的个数,记为bits

    • step2.判断bits是否是质数

  • 其中step1的操作:

更加详细的位操作技巧,阅读位运算操作常见技巧(100+收藏,5K阅读)

方法2:打表

  • 注意到数据的范围是100000,转成二进制是11110100001001000000,20位,也就是说每一位都为1的话,也只有20位,需要拿到20位以下质数打表

方法3:DP打表

  • 质数的结果可以通过打表的方式获取,每个数的位数也可以通过打表的方式获取

  • f[i]表示当前数i的二进制1的个数

    • 初始时0的二进制1的个数是0,1的二进制1的个数是1个

    • 一般情况下f[i]i>>1的结果有关,判断下当前位是否是1即可f[i & 1]

Follow Up

如果leftright的数据范围不是10^6而扩大到10亿,如何优化算法

  • 我能想到的是通过埃筛的方式快速的筛质数,然后打表

  • 你会如何做呢?欢迎评论区留言~

扩展阅读

Last updated