【问题标题】:How to efficiently convert array A to array B?如何有效地将数组 A 转换为数组 B?
【发布时间】:2021-05-06 13:54:14
【问题描述】:

我正在尝试操作数组 A 以有效地获取数组 B。 “k”是一个给定的变量。我想出了下面的逻辑,但我相信应该有更好的方法。

数组的长度总是可以被k整除

This part is not the code. It doesn't let me submit it otherwise.
k=3
Given: A = [0,1,2,3,4,5,6,7,8,9,10,11] 

Result: B = [9,10,11,6,7,8,3,4,5,0,1,2]

k = 4
Given: A = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
Result: B = [12,13,14,15,8,9,10,11,4,5,6,7,0,1,2,3]

当 k 发生变化时,A 的给定元素数量发生变化。 A 的元素数始终为 k*4。如果 k 为 2,我们的 A 数组是 [0,1,2,3,4,5,6,7],B 数组(结果)应该是 B = [6,7,4,5,2,3,0 ,1]

let A = [0,1,2,3,4,5,6,7,8,9,10,11]
k = 3
let B = []

    for (let i=A.length - (k-1); i >=0; i=i-k) {
        if (A.length - 1 <= i + k +1) {
            B = [
                ...B,
                ...(A.slice(i+1, i+k+1))
            ]
        }
    }
    B = [
        ...B,
        ...(A.slice(0,k))
    ]

【问题讨论】:

  • 也许你应该先让你的代码正常工作,然后再担心效率
  • 从正确解释你的转换逻辑开始。不要只是暗示“你们去弄清楚我想要什么”来删除代码。
  • 为了更好地了解您想要实现的目标,请同时发布 k=1 和 k=2 或 k=n 的预期结果
  • 让人们冷静下来。我不知道为什么stackoverflow如此野蛮:)对不起,我编辑了这个问题。另外,@Jaromanda,代码按预期工作。

标签: javascript arrays ecmascript-6


【解决方案1】:

保持简单:

const A = [0,1,2,3,4,5,6,7,8,9,10,11]
const k = 3

// assuming k >= 1 and A.length % k == 0
const B = []
for (let i=A.length; i>0; i-=k)
    B.push(...A.slice(i-k, i))

【讨论】:

  • 是的,这是我一直在寻找的东西。我觉得我的代码不必要地难以阅读。谢谢!
【解决方案2】:

也许这就是你想要的?

const ar=[0,1,2,3,4,5,6,7,8,9,10,11];

function regroup(ar,k){
  for (var r=[], i=k*~~ar.length/k; i>0 ; i-=k)
    r=r.concat(ar.slice(Math.max(i-k,0),i));
  // or, alternatively:
  for (var s=[], i=ar.length-k; i>-k ; i-=k)
    s=s.concat(ar.slice(Math.max(i,0),i+k));
  console.log("k:"+k+"\n1. version: "+r+"\n2. version: "+s)
}

for (let j=1; j<12; j++) regroup(ar,j)

我修改了您的示例并将k 设置为1 到11 之间的所有值。您的问题不清楚如果数组的长度不能被k 整除,您会发生什么。我假设你想从全长组开始,然后让最后一组更小(在这种情况下只有两个元素长)。

【讨论】:

  • 这仍然和 OPs 代码一样低效。
  • 我还处于了解OP的意图是什么的阶段......
  • OP 想要一种“更好”的方式来做到这一点。我怀疑是否存在比他或我的方法(*)更有效的方法(基本上都是连接子数组)。最后,这是一个品味或可读性的问题。 --- (*) 在我的 regroup 函数中,我实际上放置了我的串联方法的 两个 版本。当然只需要一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多