-
Notifications
You must be signed in to change notification settings - Fork 282
条件语句和循环语句
条件语句和循环语句是程序运行的基本逻辑。
前者只执行一次,后者不停执行。
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"]);
非常感谢你能在万千GitHub项目中发现这里,如果你也喜欢这个项目,不要忘记给我们点赞(Star)哦。
如果想知道项目的每一步进展,可以关注(Watch)我们哦。
如果想贡献代码,提交PR,可以新建一个属于自己的分支(Fork)哦。
欢迎你来到freecodecamp中文社区。