Skip to content

条件语句和循环语句

huluoyang edited this page Aug 2, 2016 · 1 revision

条件语句和循环语句是程序运行的基本逻辑。

前者只执行一次,后者不停执行。

if 语句

if(条件){//条件为真,执行这里的代码}

if else语句

if(条件){
  //条件为真,执行这里的代码
}else{
  //条件为假,执行这里的代码
}

for循环、while循环、do while循环 统称为三大循环。

for(){}
while(){}
do{}while()

条件语句和循环语句单个拎出来都挺简单的,但如果交叉使用,有同学就表示迷糊了。

这里以Mutations这题为例,传送门

Mutations是突变的意思,LOL中新出的英雄塔姆蛤蟆就是一个非常善变的英雄。

它在战场上既可以吞掉敌人然后扔向自己的营地来秒掉对手,

也可以在危险时刻吞掉自己的队友来安全撤离。

这种突变性让对方经常猜不透它的举动,让人非常无奈。

蛤蟆的名言:我就是喜欢看着你想干掉我却无可奈何的样子。

此题是一个极好的学习如何交叉使用条件语句和循环语句的例子。

很多同学的代码简化如下:

function mutation(arr) {
  var first  = arr[0].toLowerCase();
  var second = arr[1].toLowerCase();
  for(var i=0;i<second.length;i++){
    if(first.indexOf(second[i]) == -1){
      return false;  
    }else{
      return true;
    }
  }
}
mutation(["hello", "hey"]);

测试用例报错:mutation(["hello", "hey"]) 应该返回 false,而实际返回true。

题意:求两个数组的包含关系,如果前者包含后者,返回true,反之返回false。

解题思路:

首先分别找到这两个数组,定义为first和second。

然后循环second,看second的每个条目是否都能在first中找到。

一旦有一个second条目在first中找不到,说明first无法包含second。

那上面的代码问题在哪里呢?

我们来看下程序的运行逻辑:

i=0时,h在first中能找到,此时return true。

函数遇到return就结束了,根本不会执行后面的for循环,所以此时函数的返回值就是true。

这不是我们期待的结果,我们想要的结果其实是false。

i=0时,h在first中能找到,此时i++,i=1时,e在first中能找到,

此时i++,i=2时,y在first中找不到,此时函数返回false。

也就说return true应该放在for循环的外面,排除所有false结果后,才返回true。

修订如下:

function mutation(arr) {
  var first  = arr[0].toLowerCase();
  var second = arr[1].toLowerCase();
  for(var i=0;i<second.length;i++){
    if(first.indexOf(second[i]) == -1){
      return false;  
    }
  }
  return true;
}
mutation(["hello", "hey"]);
Clone this wiki locally