判定字符是否唯一

82 阅读1分钟
class Solution {
    /**
     * 二进制左移几位就是后面加几个0,前面去掉几位
     * 【39 << 2】 = 【0010 0111 << 2】 = 【1001 1100】
     * 
     * 二级制右移几位就是在二进制的前面加几位(正数加0,负数加1),后面去掉几位
     * 【39 >> 2】 = 【0010 0111 >> 2】 = 【0000 1001】
     * 
     * 按位或:只要有一个数的对应位为1,结果的对应位就为1
     * 按位与:只有两个数的对应位都为1时,结果的对应位才为1
     * 按位异或:两个数对应位相同为0,不同为1
     * @param astr
     * @return
     */
    public boolean isUnique(String astr) {
        int mark = 0;
        for (int i = 0; i < astr.length(); i++) {
            // 获取当前字符距离 'a' 字符的偏移量,因为代码中假设字符串只包含小写字母。这个偏移量会在后面的操作中用于确定标记的位置
            int moveBit = astr.charAt(i) - 'a';
            
            if ((mark & (1 << moveBit)) != 0) {
                return false;
            } else {
                // 如果当前字符没有出现过,则将 mark 的对应位置上的值设为1,表示当前字符已经出现过一次。
                mark |= (1 << moveBit);
            }
        }
        return true;
    }
}