我正在尝试为codewars.com上的以下挑战问题编写解决方案:
有一个4层的房子。那个房子里有一部电梯。您可以根据用户在电梯内接触的按钮对此电梯进行上下移动编程。
有效等级只能是这些数字:0,1,2,3
有效按钮只能是这些字符串:' 0',' 1',' 2',' 3'
可能的返回值是这些数字:-3,-2,-1,0,1,2,3
如果电梯在底层(第0级)并且用户触摸按钮' 2'电梯必须升高2级,所以我们的功能必须返回2。
如果电梯在3级,用户触摸按钮0' 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,因为输入按钮的类型是object而不是字符串。我可以提出以下代码但是我失败了大约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,而不是: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;
}
答案 0 :(得分:1)
我怀疑是因为level是一个数字,但是button是一个字符串。在javascript中,由于类型转换:
3 - '2'; // return 1
3 + '2'; // return '32';
使用函数Number()
将您的按钮字符串转换为数字,您将获得所需的真实添加行为。
答案 1 :(得分:0)
您应首先进行数据格式检查,并在计算结果时使其过于复杂。
它应该如下工作。
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;
}