You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将4×4二维数组(gameBoard)内元素全部左移

实现swipeLeft()方法解决数组左移问题

你当前的代码逻辑完全偏离需求:只是把每个位置的元素替换为右侧循环移位的元素,既没有实现非0元素左移聚集的效果,还会导致数据丢失,自然达不到预期。

要实现“将4×4数组中所有非0元素尽可能左移,空位填充0”的目标,核心是逐行处理,把每行的非0元素向左聚拢,剩余位置补0,以下是两种可行的实现方案:

方案一:临时集合收集非0元素(直观易读)

先提取每行的非0元素,再重新填充到该行的前半部分,剩余位置补0,逻辑清晰不易出错:

public void swipeLeft() {
    // 遍历每一行
    for (int r = 0; r < gameBoard.length; r++) {
        // 临时存储当前行的非0元素
        List<Integer> nonZeroElements = new ArrayList<>();
        for (int c = 0; c < gameBoard[r].length; c++) {
            if (gameBoard[r][c] != 0) {
                nonZeroElements.add(gameBoard[r][c]);
            }
        }
        // 重新填充当前行:先放非0元素,后续补0
        for (int c = 0; c < gameBoard[r].length; c++) {
            gameBoard[r][c] = c < nonZeroElements.size() ? nonZeroElements.get(c) : 0;
        }
    }
}

方案二:双指针原地修改(节省内存)

无需额外集合,用双指针在原数组上直接操作,空间效率更高:

public void swipeLeft() {
    for (int r = 0; r < gameBoard.length; r++) {
        // left指针标记当前需要填充非0元素的位置
        int left = 0;
        for (int c = 0; c < gameBoard[r].length; c++) {
            if (gameBoard[r][c] != 0) {
                // 当前元素非0且不在目标位置时,移动元素并清空原位置
                if (c != left) {
                    gameBoard[r][left] = gameBoard[r][c];
                    gameBoard[r][c] = 0;
                }
                left++;
            }
        }
    }
}

两种方案都能实现你需要的效果:

  • 初始数组:
    {0 2 4 2}
    {0 0 2 0}
    {2 2 0 0}
    {0 4 0 2}
    
  • 调用swipeLeft()后:
    {2 4 2 0}
    {2 0 0 0}
    {2 2 0 0}
    {4 2 0 0}
    

内容的提问来源于stack exchange,提问作者user21120780

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:45:17