【程序员代码面试指南】特殊数组中找到出现次数是奇数次的数

在其它数出现次数都为偶数的数组中找到出现次数为奇数次的数

https://www.nowcoder.com/questionTerminal/d0ef3e33e63a49dd99c90aeef306b0fc?f=discussion

题目描述

  • 给一个数组arr,其中只有一个数出现了奇数次,其它数都出现了偶数次,打印这个数。
  • 输入描述:第一行包含一个整数n(1<=n<=10^5),代表数组arr长度;第二行是n个数,代表数组元素arr_i(32位整数)。
    输入:
    5
    3 1 3 1 2
  • 输出描述:输出一个整数,代表出现次数为奇数次的数。输出:2
  • 备注:时间复杂度O(n),额外空间复杂度O(1)。
  • 考点:位运算

解题思路

异或(位相同异或值是0,位不同异或值是1)运算满***换律和结合律,两个相同的数异或值是0,三个相同的数异或值是其本身。由此可得,数组中出现次数是偶数次的数异或值是0,而出现次数是奇数次的数异或值是其本身。例如:2 3 5 2 5,2(0010)与3(0011)异或值是1(0001),1(0001)与5(0101)异或值是4(0100),4(0100)与2(0010)异或值是6(0110),6(0110)与5(0101)异或值是3(0011)。其中,数组中2出现次数是两次,3出现次数是一次,5出现次数是两次。

Java (javac 1.8)

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);  // 输入
        while (input.hasNext()) {
            int length = input.nextInt();  // 输入数组长度
            int arr[] = new int[length];
            int num = 0;  // 任何数num与0异或值依然是num
            for (int i = 0; i < length; i++) {
                arr[i] = input.nextInt();  // 输入数组元素值
                num = num ^ arr[i];  // 将数组每一个元素都与num异或
            }
            System.out.println(num);  // 输出num,即是数组中出现次数为奇数次的数
        }
    }
}
全部评论

相关推荐

大猪蹄子哥:1-谁教你这么写教育经历的……咱都这个学历了,很多公司要看本科、硕士,Gap Year的,你啪就给一个上大26届硕士,没了。 2-那堆奖学金揉成一行放最后得了,放前面显得你没技术自信,还是那句话,对于咱这个学历直接上重点,你这上半段看起来像个大专(无恶意 3-专业技能最好点出来细化方向,你熟悉的以太网是UDP还是TCP,是千兆还是万兆等等,多种信号处理……那你倒是说两个啊,后面空着干嘛,会的干嘛不讲 4-项目经历废话太多,描述不专业(怎么还有我,我们这种词),没有数据支撑(是婴儿还是巨人看不出来)。最后如果这些是真的XX项目、比赛,最好点出来,不然更显得像自学着玩的,或者说抄的(经典复现等于我做过 5-个人总结在咱这个分段没用
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务