自增自减与复合赋值运算,以及 for...of 中的 const 循环变量。

1. 实现代码

ts
function longestConsecutive(nums: number[]): number {
    const uniqueNums = new Set(nums);
    let longestLength = 0;

    for (const sequenceStart of uniqueNums) {
        if (uniqueNums.has(sequenceStart - 1)) {
            continue;
        }

        let sequenceEnd = sequenceStart;
        while (uniqueNums.has(sequenceEnd + 1)) {
            sequenceEnd++;
        }

        const sequenceLength = sequenceEnd - sequenceStart + 1;
        longestLength = Math.max(longestLength, sequenceLength);
    }

    return longestLength;
}

2. 笔记

2.1 自增、自减与复合赋值

++ 和 -- 分别将操作数加一、减一,都有前缀和后缀两种写法。它们不仅修改变量,还会产生一个表达式结果。前缀产生修改后的值,后缀产生修改前的值。

ts
let i = 3;
const a = i++;

console.log(a); // 3
console.log(i); // 4

let j = 3;
const b = ++j;

console.log(b); // 4
console.log(j); // 4

i++ 在表达式求值时就会修改 i,并不是等到整条语句结束才自增;后缀形式只是把修改前的值作为表达式结果。--i、i-- 的区别同理。

如果只单独更新变量、不使用表达式结果,i++; 和 ++i; 的效果相同。本题中的 sequenceEnd++; 就属于这种用法。

+=、-=、*=、/= 等称为复合赋值运算符。对于 number 变量,可以按下表理解:

写法含义
x += yx = x + y
x -= yx = x - y
x *= yx = x * y
x /= yx = x / y
x %= yx = x % y,求余
x **= yx = x ** y,求幂

number 的除法不会自动截断为整数:

ts
let value = 5;
value /= 2;

console.log(value); // 2.5

2.2 for...of 中可以使用 const 循环变量

for...of 逐个取得可迭代对象提供的值。 const 不会阻止循环取得不同的值,因为每轮迭代都会建立新的变量绑定。不同轮次的 value 各自独立绑定;同一轮中,不能再给当前的 value 重新赋值。

ts
// sequenceStart 保留这一轮取得的起点
for (const sequenceStart of uniqueNums) {
    // sequenceEnd 可以继续递增,用于向后扫描
    let sequenceEnd = sequenceStart;
}