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

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

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,即是数组中出现次数为奇数次的数
        }
    }
}
全部评论

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务