题目描述
- 给一个数组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,即是数组中出现次数为奇数次的数 } } }