0

有人可以解释为什么如果我在行中省略分号while(nums[right-1] == nums[right--]);会出现语法错误吗?我一般理解分号的意义,但为什么这个特定行而不是其他行?

var threeSum = function(nums) {
    nums.sort((a,b)=>a-b);
    let result = [];
    for (let i=0;i<nums.length;i++) {
        let t = -nums[i];
        let left = i+1, right = nums.length-1;
        while(left < right) {
            if (nums[left] + nums[right] == t) {
                result.push([nums[i], nums[left], nums[right]]);
                while(nums[left+1] == nums[left++]);
                while(nums[right-1] == nums[right--]);
            } else if (nums[left]+nums[right] < t) left++;
            else right--;
        }
        while(nums[i+1]==nums[i]) i++
    }

    return result;

};
4

2 回答 2

1

@David 的解释很好,我会补充一点,为了避免这些错误,你应该考虑遵循像 airbnb 这样的样式指南。使您的代码更易于阅读。

实现方式:替换+++=. 注释代码的主要部分......等

好的代码是您可以通过阅读来理解的代码。我应该已经了解threeSums功能在做什么以及为什么while仅通过查看它来执行这些。

// the function do blabla
function threeSums(nums) {
  nums.sort((a, b) => a - b);

  const result = [];

  for (let i = 0; i < nums.length; i += 1) {
    // what is t?
    const t = -nums[i];

    let left = i + 1;
    let right = nums.length - 1;

    while (left < right) {
      // what is the case covered by this if?
      if (nums[left] + nums[right] == t) {
        result.push([
           nums[i],
           nums[left],
           nums[right],
        ]);

        while (nums[left + 1] == nums[left]) {
          left += 1;
        }

        while (nums[right - 1] == nums[right]) {
          right -= 1
        }
      } else if (nums[left] + nums[right] < t) {
        left += 1;
      } else {
        right -= 1;
      }
    }

    while (nums[i + 1] == nums[i]) {
      i += 1;
    }
  }

  return result;
};
于 2020-01-29T16:59:28.603 回答
1

循环需要一些东西来循环。基本上是一个语句或一个代码块。例如:

while (something) {
  this.isInACodeBlock();
}

或者:

while (something)
  this.isAStatement();

请记住,声明可以是无操作的。分号本身就可以达到这个目的。由于回车与语言无关,这是一个带有语句的循环:

while (something);

迈出一步,这个循环一个代码块内,在循环之后结束:

if (somethingElse) {
  while (something)
}

如果循环后面只有一个语句,while那么它在语法上是正确的,即使行为是意外的或错误的。但是有一个右花括号。

所以解释器期待一个语句或一个开始块,但它遇到了一个结束块。这是一个错误。

于 2020-01-29T16:40:07.973 回答