位运算

利用这个性质,我们可以用来判断“美好字符”

美好字符:一个字符串中同时存在一个字母的大小写.

如:”abAB”, “abA” 则不是美好字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var longestNiceSubstring = function (s) {
const n = s.length;
let maxPos = 0;
let maxLen = 0;
for (let i = 0; i < n; ++i) {
let lower = 0;
let upper = 0;
for (let j = i; j < n; ++j) {
if ("a" <= s[j] && s[j] <= "z") {
/*
用来标记26个字母着实精妙啊!!!!!

如 'abc' => 00000000000000000000000111 对应如下二进制 1 代表存在 0 代表不存在该字母

lower是用来标记小写字母是否存在的变量,(二进制)从最低位[0]到[25]正好对应26个字母,’zyx.............cba‘,对应位为1代表有这个字母,0代表没有。s.charAt(j) - 'a'是获取对应的下标,例如,j='b'时,这个值计算出来为1,左移1位,是000......10,代表的就是字母'b',与标志lower进行与操作,相当于对应位置1.
*/
lower |= 1 << (s[j].charCodeAt() - "a".charCodeAt());
} else {
upper |= 1 << (s[j].charCodeAt() - "A".charCodeAt());
console.log(s[j].charCodeAt() - "A".charCodeAt());
}
// 如果两个字符相等,且比上一次的美好字符组合长度长,那么就记录下来。
if (lower === upper && j - i + 1 > maxLen) {
maxPos = i;
maxLen = j - i + 1;
}
}
}
return s.slice(maxPos, maxPos + maxLen);
};

利用二进制位对表字母存储,着实精妙

统计数字二进制的个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function numberOf1(n) {
let cnt = 0;

/*
1100 -1 = 1011
1100&1011=1000 , 可以发现每次做这样的操作都可以消除 1个1,
消除完,即时1 的个数
*/

while (n) {
cnt++;
n = (n - 1) & n;
}
return cnt;
}

http://example.com/算法与数据结构/位运算/
作者
chen heng cheng
发布于
2024年5月30日
许可协议