Java查找出现奇数次整数,qualified.io测试未通过求排查
解决列表中寻找出现奇数次整数的问题
我太懂这种明明觉得思路没问题,但测试就是不通过的憋屈感了!先看你提到的示例数组[5,1,1,5,2,2,5],5确实出现了3次(奇数次),其他元素都是偶数次,所以结果应该是包含5的List。咱们来捋捋你的问题,再给出靠谱的解决方案。
先说说你现有代码的问题
你开头判断了列表长度是否为偶数,但这个条件和元素出现次数的奇偶性根本不挂钩:比如列表长度是偶数时,可能存在两个元素各出现奇数次;长度是奇数时,可能只有一个元素出现奇数次。这个判断分支不仅帮不上忙,反而容易让你偏离正确的逻辑方向。
方案一:通用型——用哈希表统计次数(适合多个元素出现奇数次的情况)
这种方法不管题目是否限制只有一个目标元素,都能准确找出所有出现奇数次的整数,逻辑直白好理解:
- 遍历列表,用哈希表记录每个数字的出现次数
- 遍历哈希表,筛选出次数为奇数的数字,加入结果List
代码实现:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class OddFinder { public static List<Integer> findOdd(List<Integer> integers) { Map<Integer, Integer> countMap = new HashMap<>(); // 统计每个数字的出现次数 for (int num : integers) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } List<Integer> result = new ArrayList<>(); // 筛选出现奇数次的数字 for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) { if (entry.getValue() % 2 != 0) { result.add(entry.getKey()); } } return result; } }
方案二:高效型——用异或运算(适合题目保证只有一个元素出现奇数次的情况)
如果题目明确说明只有一个元素出现奇数次,那异或运算绝对是最优解,时间复杂度O(n),空间复杂度O(1),利用了异或的两个核心特性:
- 相同数字异或结果为0(比如
1^1=0) - 0和任何数字异或结果为该数字本身(比如
0^5=5)
遍历列表把所有数字异或起来,最终结果就是那个出现奇数次的数字,再把它加入List返回即可:
import java.util.ArrayList; import java.util.List; public class OddFinder { public static List<Integer> findOdd(List<Integer> integers) { int xorResult = 0; for (int num : integers) { xorResult ^= num; } List<Integer> result = new ArrayList<>(); result.add(xorResult); return result; } }
你可以根据题目要求选择对应的方案,把代码替换后再去测试,应该就能通过了!
内容的提问来源于stack exchange,提问作者sahmad
相关产品推荐
相关产品推荐

