我试图为在codewars.com上发现的以下挑战问题编写一个解决方案:
有一座四层的房子。那所房子里有一部电梯。您可以编程这个电梯上或下,取决于用户触摸电梯内的按钮。
有效级别只能是以下数字:0、1、2、3
有效的按钮只能是以下字符串:'0','1','2','3‘
可能的返回值是以下数字:-3,-2,-1,0,1,2,3
如果电梯在一楼(第0层),用户触摸按钮“2”,电梯必须上升2层,所以我们的功能必须返回2。
如果电梯在第三层,用户点击“0”按钮,电梯必须下降3层,所以我们的功能必须返回-3。
如果电梯在第二层,用户触摸按钮“2”,电梯必须保持在相同的水平,所以我们返回0。
我们不能危及乘客的生命,因此,如果我们得到了不合时宜的投入,我们的电梯必须保持在同一水平上。例如:
goto(2,'4')必须返回0,因为电梯中没有“4”按钮。goto(4,'0')必须返回0,因为没有级别4。goto(3,undefined)必须返回0。goto(undefined,'2')必须返回0。goto([],'2')必须返回0,因为输入级别的类型是数组而不是数字。goto(3,{})必须返回0,因为输入按钮的类型是对象而不是字符串。我可以想出以下的代码,但我失败了大约40%的测试用例。有人能告诉我我的逻辑哪里错了吗?
function goto(level,button){
var arr = [0, 1, 2, 3];
var result = 0
for(var i = 0; i < arr.length; i++){
for(var j = 0; j < arr.length; j++){
if(level === arr[i] && button === arr[j]){
if(level < button){
result = level + button;
}else{
result = button - level;
}
}
}
}
return result;
}我正在重构我的代码,但我仍然失败了31个测试用例中的一个,并给出了以下消息:
预期: 0,而不是got: 1
重构代码:
function goto(level,button){
var valid = [0, 1, 2, 3];
button = Number(button);
if (typeof level === 'number' && typeof button === 'number') {
for(var i = 0; i < valid.length; i++){
for(var j = 0; j < valid.length; j++){
if(level === valid[i] && button === valid[j]){
return button - level;
}
}
}
}
return 0;
}发布于 2018-04-18 07:47:20
我怀疑这是因为级别是一个数字,然而按钮是一个字符串。在javascript中,由于类型转换:
3 - '2'; // return 1
3 + '2'; // return '32';使用函数Number()将按钮字符串转换为数字,您将具有所需的真正添加行为。
发布于 2018-04-18 07:49:52
您应该先进行数据格式检查,并使计算结果过于复杂。
它应按以下方式工作。
function goto(level,button){
var floors = [0, 1, 2, 3];
var level_num = parseInt(level);
var button_num = parseInt(button);
if (typeof floors[level_num] == 'undefined' || typeof floors[button_num] == 'undefined') {
return 0;
}
return button_num - level_num;
}https://stackoverflow.com/questions/49893674
复制相似问题