我正在处理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)
答案 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)
检查我的解决方案并在本文中进行解释
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.
}