题目分析与解题思路 题目要求解决的是一个数组处理的问题,具体来说,是对于输入数组 inp,每个元素代表一个数值,如果这个数值是第一次出现,则加到总和 sum 中;如果是第二次或更多次出现,则从 sum 中减去该数值。最终返回处理后的总和 sum。 解题思路 使用标记数组:为了判断某个元素是否出现过,使用一个足够大的数组(如 int[] a = new int[1001])作为标记数组,数组的大小应该能够覆盖所有可能出现的输入值。如果输入值的范围不确定或很大,可以考虑使用 HashMap 等数据结构来优化空间复杂度。 遍历输入数组:遍历输入数组 inp,对于每个元素,检查它是否已经在标记数组中出现过。 如果未出现过(即标记数组中对应位置为0),则将其标记为已出现(设为1),并将其值加到总和 sum 中。 如果已出现过(即标记数组中对应位置不为0),则将其值从总和 sum 中减去。 返回结果:遍历完成后,返回总和 sum。 图解 假设输入数组为 [0, 1, 0, 1, 2]: 初始化标记数组 a 为全0,总和 sum 为0。 遍历数组: 第1个元素 0:未出现过,标记为已出现,sum += 0,sum 变为0。 第2个元素 1:未出现过,标记为已出现,sum += 1,sum 变为1。 第3个元素 0:已出现过,sum -= 0,sum 保持为1。 第4个元素 1:已出现过,sum -= 1,sum 变为0。 第5个元素 2:未出现过,标记为已出现,sum += 2,sum 变为2。 遍历完成,返回 sum 的值2。 代码详解 java 复制代码 public class Main { public static int solution(int[] inp) { int[] a = new int[1001]; // 标记数组,大小设为1001,假设输入值不会超出这个范围 int sum = 0; // 总和 // 遍历输入数组 for (int i = 0; i < inp.length; i++) { if (a[inp[i]] == 0) { // 如果标记数组对应位置为0,表示未出现过 a[inp[i]] = 1; // 标记为已出现 sum += inp[i]; // 加到总和中 } else { // 如果标记数组对应位置不为0,表示已出现过 sum -= inp[i]; // 从总和中减去 } } return sum; // 返回处理后的总和 } public static void main(String[] args) { // 测试用例 int[] inp = {0, 1, 0, 1, 2}; System.out.println(solution(inp)); // 输出应为2 // 其他测试用例 // System.out.println(solution(new int[]{1, 1, 2, 2, 3, 3, 4, 5, 5}) == 4); // 输出应为4 // System.out.println(solution(new int[]{0, 1, 0, 1, 2}) == 2); // 输出应为2 } } 总结 这个问题通过利用标记数组来记录元素的出现状态,通过一次遍历数组即可得到结果,时间复杂度为O(n),其中n是数组的长度。这种方法简单直观,但需要足够的空间来存储标记数组。如果输入值的范围非常大,可以考虑使用 HashMap 等数据结构来优化空间复杂度。