每日一题找到出现奇数次的数

Posted 唐宋xy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题找到出现奇数次的数相关的知识,希望对你有一定的参考价值。

题目

一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数?

解析

有多种解法可以计算到出现奇数次的数,这里举例两种:

  1. 使用额外空间(暴力法)
    • 时间复杂度:O(N)
    • 空间复杂度:O(N)
  2. 位运算
    • 时间复杂度: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;

以上是关于每日一题找到出现奇数次的数的主要内容,如果未能解决你的问题,请参考以下文章

每日一题找到出现奇数次的数

每日一题找到出现奇数次的数

数组中有两种数出现了奇数次,其他数都出现了偶数次,分别找出出现奇数次的数

每日一题找到出现了K次的数

每日一题找到出现了K次的数

《程序员代码面试指南》第七章 位运算 在其他数都出现偶数次的数组中找到出现奇数次的数