【问题标题】:array shift and sum [closed]数组移位和求和[关闭]
【发布时间】:2023-03-15 04:21:01
【问题描述】:

帮助解决这个问题,或者给我这个算法的名称:

给定一个长度为 N 的一维数组,随机填充数字,所有数字都是 2 的幂。可以对数组执行两种操作:左移和右移。当左(右)移时,两个并列的相同数字被汇总;一个新值被放置在左(右)单元格中。数组中向右(左)的值向左(右)移动一位。 [1,4,16,8,8,2,1] > left > [1,4,16,16,2,1] > right > [1,4,32,2,1]。找出将产生最小数组长度的移位序列。

【问题讨论】:

  • @Andreas 我至少需要算法的名称,然后我自己来实现它。
  • 看不懂描述,左右“移位”有什么区别?更具体地说,什么是“在左(右)单元格中放置了一个新值”?
  • 在你的例子中,如果你先右移,然后左移,结果会有什么不同?您谈到“设置了新价值......”,但我在您的示例中没有看到这一点,并且想知道那个价值是什么?

标签: javascript arrays algorithm shift


【解决方案1】:

所描述的转变似乎是对happening in the 2048 game 的概括,但仅在一维中,并且没有任何零。我认为该算法没有名称,但在 2048 游戏的上下文中,这种转换通常被称为“瓦片合并”。

首先请注意,左移或右移的效果没有区别。两者都给出相同的结果。

您可以使用一个索引遍历数组,并跟踪另一个二级索引,当两个值“合并”时,该二级索引不会增加。取而代之的是,每次合并后,只要可以发生合并,二级索引就会向后移动,然后它将与主索引一起再次递增。当没有发生合并时,主索引处的值仅被复制到辅助索引。

这是代码中的样子:

function collapse(arr) {
    let j = 0;
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] === arr[j]) {
            do {
                arr[j] *= 2;
                j--;
            } while (j >= 0 && arr[j] === arr[j+1]);
            j++;
        } else {
            j++;
            arr[j] = arr[i];
        }
    }
    // clip the array, throw away anything beyond index j:
    arr.length = j+1;
    return arr;
}

// Example
let arr = [1,4,16,8,8,2,1];
console.log(collapse(arr));

这里函数返回结果数组,但如果只需要它的长度,可以返回j+1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多