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

能否仅使用1个数组实现在负数元素后插入零的功能?

当然可以!完全不需要用两个ArrayList来实现这个需求——不管是用单个ArrayList原地修改,还是用Java原生数组(如果这里的“数组”指原生固定长度数组的话),都能搞定。我给你两种可行的方案,你可以根据自己的需求选择:


方案1:单个ArrayList原地修改

ArrayList本身是动态扩容的,我们可以直接在原集合上操作,但要注意遍历的顺序:从后往前遍历是最稳妥的方式,这样插入的0不会干扰还没处理到的原元素。

完整代码示例

import java.util.ArrayList;
import java.util.Scanner;

public class Task_108 {
    public void Task108() {
        System.out.println("Input size of array: ");
        Scanner scn = new Scanner(System.in);
        int sizeArr = scn.nextInt();
        ArrayList<Integer> arrIntNum = new ArrayList<>(sizeArr);
        
        // 读取用户输入的原数组元素
        System.out.println("Input elements:");
        for (int i = 0; i < sizeArr; i++) {
            arrIntNum.add(scn.nextInt());
        }
        
        // 从后往前遍历,避免插入的0被重复处理
        for (int i = arrIntNum.size() - 1; i >= 0; i--) {
            if (arrIntNum.get(i) < 0) {
                // 在当前负数的下一个位置插入0
                arrIntNum.add(i + 1, 0);
            }
        }
        
        // 输出处理后的结果
        System.out.println("Result array:");
        for (int num : arrIntNum) {
            System.out.print(num + " ");
        }
        scn.close();
    }
    
    public static void main(String[] args) {
        new Task_108().Task108();
    }
}

为什么从后往前?

如果从前往后遍历,插入0后集合长度会增加,后续的索引会偏移,需要手动调整遍历的索引(比如插入后跳过新增的0),容易出错。从后往前的话,已经处理过的元素在末尾,插入操作不会影响前面还没遍历到的元素,逻辑更简单。

如果非要从前往后遍历,也可以这么写(需要注意索引调整):

int i = 0;
while (i < arrIntNum.size()) {
    if (arrIntNum.get(i) < 0) {
        arrIntNum.add(i + 1, 0);
        i += 2; // 插入后直接跳到下一个原元素,跳过新增的0
    } else {
        i++;
    }
}

方案2:用原生数组实现(单个结果数组)

如果这里的“数组”指Java原生的固定长度数组,那我们需要先计算出结果数组的长度:原数组长度 + 原数组中负数的个数。然后遍历原数组,逐个复制到结果数组,遇到负数就先放负数,再放0。

完整代码示例

import java.util.Scanner;

public class Task_108 {
    public void Task108() {
        System.out.println("Input size of array: ");
        Scanner scn = new Scanner(System.in);
        int sizeArr = scn.nextInt();
        int[] originalArr = new int[sizeArr];
        
        // 读取用户输入的原数组元素
        System.out.println("Input elements:");
        for (int i = 0; i < sizeArr; i++) {
            originalArr[i] = scn.nextInt();
        }
        
        // 统计原数组中负数的个数,用于计算结果数组长度
        int negativeCount = 0;
        for (int num : originalArr) {
            if (num < 0) {
                negativeCount++;
            }
        }
        
        // 创建结果数组
        int[] resultArr = new int[sizeArr + negativeCount];
        int currentIndex = 0;
        for (int num : originalArr) {
            resultArr[currentIndex++] = num;
            // 遇到负数,在后面插入0
            if (num < 0) {
                resultArr[currentIndex++] = 0;
            }
        }
        
        // 输出处理后的结果
        System.out.println("Result array:");
        for (int num : resultArr) {
            System.out.print(num + " ");
        }
        scn.close();
    }
    
    public static void main(String[] args) {
        new Task_108().Task108();
    }
}

两种方案都只用到了一个核心集合/数组来存储最终结果,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:37:19