每日一题找到出现奇数次的数
Posted 唐宋xy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题找到出现奇数次的数相关的知识,希望对你有一定的参考价值。
题目
一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数?
解析
有多种解法可以计算到出现奇数次的数,这里举例两种:
- 使用额外空间(暴力法)
- 时间复杂度:O(N)
- 空间复杂度:O(N)
- 位运算
- 时间复杂度:O(N)
暴力法
使用Map保存当前元素以及元素出现的次数
public int printTimesNum2(int[] arr)
if(arr == null || arr.length == 0)
return -1;
// key->当前元素 value->出现次数
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++)
map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
for (int i = 0; i < arr.length; i++)
if(map.get(arr[i]) % 2 != 0)
return arr[i];
return -1;
位运算
算法思路
因为位运算满足交换律和结合律,并且位运算的基本规则:
- N ^ N = 0
- 0 ^ N = N
那么最终出现偶数次的所有数经过位运算之后一定会为0,那么就会出现0^某个数,那么最终得到的就是这个出现奇数次的数。
public int printTimesNum(int[] arr)
if(arr == null || arr.length == 0)
return -1;
int eor = 0;
for (int i = 0; i < arr.length; i++)
eor ^= arr[i];
return eor;
以上是关于每日一题找到出现奇数次的数的主要内容,如果未能解决你的问题,请参考以下文章