能否仅使用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
相关产品推荐
相关产品推荐

