javascript中的简单电梯

时间:2018-04-18 07:28:56

标签: javascript

我正在尝试为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;
 }

2 个答案:

答案 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;
}