Javascript中的数组左旋转将记录到控制台,但不会返回

时间:2018-07-06 23:18:30

标签: javascript arrays

我正在处理Hackerrank上的数组左旋转。我拥有的解决方案将console.log包含正确结果的数组,但使用return无效。这是他们网站上的详细信息-“在执行d次向左旋转后,打印一行n个以空格分隔的整数,这些整数表示数组的最终状态。”我已经读到问题可能出在node.js中运行的异步函数,但是我不确定如何解决。

// sample input - 1 2 3 4 5
// sample output - 5 1 2 3 4

function rotLeft(a, d) {
  var arr = [];

    for (var i = 1; i <= a; i++){
      arr.push(i)
    };
    for (var j = 1; j <= d; j++){
    	arr.shift(arr.push(j))
    }
    console.log(arr.toString()); // <-- this will print the desired output.
    return arr.toString(); // <-- no return from this.
}


rotLeft(5, 4)

18 个答案:

答案 0 :(得分:4)

我也一直试图解决这个问题。您当前的解决方案中存在一些问题。看到您必须创建一个数组并将从参数传递的数组存储在其中。 您要做的只是创建一个新数组,并添加其中应该包含的元素数量的顺序,例如,您正在a.length=5进行操作。但问题是要有一系列用户选择。第二件事是您应该返回一个数组而不是字符串。

这是此问题的解决方案:

arr.push 1 2 3 4 5

答案 1 :(得分:2)

我将为以后的访问者提供解决此问题的方法。

您可以在一行中执行以下操作:

function rotLeft(a, d)
 {
    let rslt = a.slice(d).concat(a.slice(0,d));
    return rslt
 }

您需要将初始数组 split 分为两个部分,位于第 d 个位置,然后只需将这两个部分交换即可。

  

slice()方法返回数组一部分的浅表副本   放入从头到尾选择的新数组对象中(不包括结尾)。   原始数组将不会被修改。

var animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]

console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]

console.log(animals.slice(1, 5));
// expected output: Array ["bison", "camel", "duck", "elephant"]

答案 2 :(得分:2)

function rotLeft(a, d) {
    return [...a.slice(d - a.length), ...a.slice(0, d - a.length)]
}

答案 3 :(得分:1)

这里的主要问题是hackerrank期望rotLeft的返回值是一个数组,而不是一串用空格分隔的数字。不幸的是,说明并不清楚。正如您在预定义的main函数中看到的,您不应更改:

  // ...
  const a = readLine().split(' ').map(aTemp => parseInt(aTemp, 10));
  const result = rotLeft(a, d);
  ws.write(result.join(' ') + '\n'); // <--- result must be an array for .join to work
  ws.end();
}

您的代码也有一些错误。 (数组是零索引的,其中之一-它们不是1索引的。而且,i <= a不是正确的条件-a array ,所以您需要使用a.length。)请改用此函数,它简单得多,似乎可以通过所有测试用例:

function rotLeft(a, d) {
  return [...a.slice(d), ...a.slice(0, d - a.length)]
}

答案 4 :(得分:1)

您真的不需要两个循环。要向左旋转n个位置:

function RotateLeft(arr, n, len = arr.length) {
    return arr.map(function() {
        n = n < len ? n : 0; 
        return arr[n++];
    });
}

var array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var places = 4;

console.log(RotateLeft(array, places));
//[4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3]

答案 5 :(得分:1)

不使用任何额外的循环和功能

function rotLeft(a, d) {
    var arr = [];
    var l = 0;
    for(let i=0;i<a.length;i++){
        if(i >= d){ 
            arr[i-d] = a[i]
        }else{
            arr[a.length-d+l] = a[i];
            l = i+1;
        }
    }
    return arr
}

答案 6 :(得分:1)

在真正的编码面试中,您将无法使用 Javascript 中的任何辅助函数(面试官 100% 会要求您使用简单的 for 循环或递归来解决问题),因此您应该只使用基础知识:for 循环或递归

可以完成工作但面试官不会接受此解决方案的单行解决方案:

function rotLeft(a,d){
    return [...a.slice(d, a.length),  ...a.slice(0, d)]
}

for 循环的解决方案:

function rotLeft(a, d) {
    let l = a.length;
    
    let temp = [];
    
    for(let i = 0; i < l; i++){
        temp[i] = a[i];
    }  
      
    for (let i = 0; i < l - d; i++ ){
        a[i] = temp[d + i]
    }
    
    for (let i = 0; i < d; i++){  
        a[i + (l - d)] = temp[i]
    }
    return a
}

答案 7 :(得分:1)

检查我的解决方案并在本文中进行解释

https://medium.com/@aamirafridi/how-to-solve-hackerranks-left-rotation-array-challenge-javascript-c032527802a7

function rotLeft(a, d) {
  d = d % a.length;
  if (d === 0) return a;
  return a.concat(a.splice(0, d));
}

console.log(rotLeft([1,2,3,4,5],1));
console.log(rotLeft([1,2,3,4,5],2));
console.log(rotLeft([1,2,3,4,5],3));
console.log(rotLeft([1,2,3,4,5],4));
console.log(rotLeft([1,2,3,4,5],5));
console.log(rotLeft([1,2,3,4,5,6,7,8,9,10],5));

答案 8 :(得分:0)

这个也通过了所有测试:

function rotLeft(a, d) {
    // Write your code here
    return (a.splice(d, a.length)).concat(a.splice(0, d));
}

答案 9 :(得分:0)

这就是我所做的,没有循环

function rotLeft(a, d) {
  const splited = a.slice(0,d)
  const restOfSplit = a.slice(d, a.length)
  return (restOfSplit.concat(splited))
}

答案 10 :(得分:0)

function rotLeft(a, d) {
    let array = [];
    for(let i=0; i<a.length; i++){
        if(i>=d){
           array[i-d] = a[i] 
        } else {
           array[i-d+a.length] = a[i];
        }
    }
    return array;
} 

答案 11 :(得分:0)

function rotLeft (a, d) {
  if(d === 0) {
    return a
    }
  
  return a.concat(a.splice(0, d))
}

console.log(rotLeft([1,2,3,4,5], 4))

最简单的一个。您不必首先阅读聪明的男孩一堆多余的不必要的句子。

答案 12 :(得分:0)

/workflow/{workflowId}/remove?archiveWorkflow=false

}

答案 13 :(得分:0)

如果您不使用任何内置方法,则可以编写自己的javascript函数。

尝试一下。

function swap(arr,idx1,idx2){
    let temp = arr[idx1];
    arr[idx1] = arr[idx2];
    arr[idx2] = temp;
}

function rotation(arr,n){
    let j = 0;
    while(j<n){
        for(let i = 0; i<arr.length-1; i++){
            swap(arr,i,i+1);
        }
        j++;
    }
  console.log(arr);
   return arr;
}
let arr = [1,2,3,4,5,6,7];
rotation(arr,2)

答案 14 :(得分:0)

您可以尝试以下算法:

例如,假设输入为:

var xArray = [1, 2, 3, 4, 5];
var numberOfLeftRotations = 4;
var newArray = [];

for (var i = 0; i < xArray.length; i++) {
  var newIndex = (i + numberOfLeftRotations) % xArray.length;
  newArray[i] = xArray[newIndex];
}
console.log(newArray);

答案 15 :(得分:0)

我尝试了所有上述情况。什么都没有为我工作。但是我自己解决了这个问题。轮换程序中的黑客。

第一次检查d分配值是否为'4' 例如:-const d = parseInt(nd[1], 10);而非const d = parseInt(nd[2], 10)

转到旋转方法:

function rotLeft(a, d) {
    let i = 0;
    while (i < d) {
        a.push(a.shift());
        i++;
    }
    console.log(a);
    return a;
}

一切正常。

答案 16 :(得分:0)

我这样回答,这很简单

function rotLeft(a, d) {
    for(var i = 1; i <= d; i++) {
        a.push(a.shift());
    }
    return a;
}

答案 17 :(得分:0)

这将通过所有测试用例,因为数组值可能与[1,2,3,5,5]不同

函数rotLeft(a,d){   var arr = [];

for (var i = 1; i <= a; i++){
  arr.push(a[i])
};
for (var j = 1; j < d; j++){
    arr.shift(arr.push(a[j]))
}
console.log(arr); // <-- this will print the desired output.
return arr; // <-- no return from this.

}