【问题标题】:Shifting array within loop在循环内移动数组
【发布时间】:2020-05-17 01:27:27
【问题描述】:

我有一个数组,我想将它移动 n 次并返回一个新的移动数组数组。

如[1,2,3,4]变成

[[ 1, 2, 3, 4 ],
[ 2, 3, 4, 1 ],
[ 3, 4, 1, 2 ],
[ 4, 1, 2, 3 ],
[ 1, 2, 3, 4 ],
[ 2, 3, 4, 1 ],
...

使用

function dataShift(len, inp){
var row = inp;
var rows = [];
for (var i=0;i<len;i++) {
    row.push(row.shift());
    rows.push(row);
    console.log(rows[i]);
}
return rows;
}

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

console.log(rows[i]) 将打印所需的结果,但 console.log(dataShift(5,[1,2,3,4])) 仅包含原始数组 len 次的最后一个排列。

我怎样才能达到我想要的结果?

【问题讨论】:

  • 你必须创建一个新数组,而不是总是追加同一个。
  • 您的算法并没有达到您的预期,它只是将数组的元素放入另一个数组中,不执行任何排列。
  • rows.push(row.slice());
  • 我现在明白了。使用 inp.slice()。谢谢!

标签: javascript arrays node.js


【解决方案1】:
function dataShift(len, inp){
var row = inp;
var rows = [];
for (var i=0;i<len;i++) {
    row.push(row.shift());
    var new1 = row.slice(0,len);
    rows.push(new1);
}
return rows;
}

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

var new1 = row.slice(0, len) 行是魔法所在。 row.slice 创建一个新的数组对象。

您之前的方法(直接推送)最终会生成一个指向同一对象的对象引用数组。因此,当您修改对象时,所有引用都会更新。

如果您不想使用slice(),另一种方法是使用JSON.parse(JSON.stringify(row))

【讨论】:

  • 您的代码应附有简要说明。
【解决方案2】:
public static int [] leftSwap(int [] arr, int n) {
        int l = arr.length;
        int [] result = new int[l];
        int  m = 0 ;
        int criticalIndex = l - n ;
        for(int i = 0 ; i <result.length  ; i++) {
            if(i < criticalIndex) {
                result[i] = arr[n];
                n++;
            }

            else {

                result[i] = arr[m];
                        m++;
            }

        }

        return result;
    }

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2017-08-20
    • 2019-02-13
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多