如何将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
相关产品推荐
相关产品推荐

