题目
解题
解题一
代码里注释 注意点1 的部分,循环结束条件是 i < 32
,比如 2147483647 (0x7FFFFFFF) 得到的数组是 [0, 31, 1],要把前面的 0 也算进去,因为第 32 位可以由 0 变为 1,这样最长的 1 序列长度为 32。注意点2,因为每次 searchingFor 变换才会将之前的序列长度加入数组,最后一次没有变换便跳出循环,要把最后的序列长度加进数组。注意点4,如果反转把 count 重置为 0,也要 count++。注意点5,maxLen 初始化为 1。
在 findLongestSequence 中,要注意 分情况讨论。
// javascript
var reverseBits = function(num) {
if (num === ~0) return 32; // 注意点3
let sequences = getAlternatingSequences(num);
return findLongestSequence(sequences);
};
var getAlternatingSequences = function(num) {
let sequences = [];
let searchingFor = 0, count = 0;
for (let i = 0; i < 32; i++) { // 注意点1
if ((num & 1) !== searchingFor) {
sequences.push(count);
searchingFor = num & 1;
count = 0;
}
count++; // 注意点4
num >>>= 1;
}
sequences.push(count); // 注意点2
return sequences;
};
var findLongestSequence = function(sequences) {
let zerosLen = 0, onesLeftLen = 0, onesRightLen = 0;
let curLen = 0, maxLen = 1; // 注意点5
for (let i = 0; i < sequences.length; i += 2) {
zerosLen = sequences[i];
onesRightLen = (i - 1 >= 0) ? sequences[i - 1] : 0;
onesLeftLen = (i + 1 < sequences.length) ? sequences[i + 1] : 0;
if (zerosLen === 1) {
curLen = onesRightLen + onesLeftLen + 1;
}
else if (zerosLen === 0) {
curLen = Math.max(onesRightLen, onesLeftLen); // 注意点6
}
else {
curLen = Math.max(onesRightLen, onesLeftLen) + 1;
}
maxLen = Math.max(curLen, maxLen);
}
return maxLen;
};
解题二
代码里注释 注意点3 的部分,如果 preLen > 0,说明 前一个 1 序列和当前 1 序列中间存在 1 个 0,把该 0 变成 1 就可以让 1 序列长度变成 preLen + curLen + 1;如果 preLen = 0,可以在该 1 序列前面或者后面翻转一个 0,让长度加 1:0 + curLen + 1,只有 -1 是例外,所以在一开始会判断是否为 -1。
// javascript
var reverseBits = function(num) {
if (num === -1) return 32; // 注意点4
let maxLen = 1, preLen = 0, curLen = 0;
while (num !== 0) {
if (num & 1 === 1) {
curLen++;
}
else {
preLen = (num & 2 === 0) ? 0 : curLen;
curLen = 0;
}
num >>>= 1;
maxLen = Math.max(preLen + curLen + 1, maxLen); // 注意点3
}
return maxLen;
};