package dataStructure.eor;
import java.util.HashSet;
public class EroSelectSingleOddNumber {
/**
* 问题提出:给一串数,求解在这串数当中为奇数位数的数是哪个数
* 方法分析,可以使用暴力循环的方式来求解出为奇数位数的数是哪个,但是使用异或运算来求解将会相当简便。
*/
public static int ero(int[] arr) {
int number = 0;
for (int i = 0; i < arr.length; i++) {
/**
* 异或运算
* 异或运算的原理是因为异或运算就是无进位的二进制相加运算,偶数个数就会相加成0,但是奇数个数的数异或以后还会回到这个数本身
* 异或运算具有交换律性质,数据的奇数还有偶数所在的位置计算没有影响
*/
number ^= arr[i];
}
return number;
}
/**
* 常规方法
*
*/
public static int hashSelect(int[] arr) {
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < arr.length; i++) {
//查看HashSet当中有没有这个值,如果没有,就添加进来
if (!set.contains(arr[i])) {
set.add(arr[i]);
//如果有这个值了,弹出
} else {
set.remove(arr[i]);
}
}
for (int i = 0; i < arr.length; i++) {
//查看拣取出来的值
if (set.contains(arr[i])) {
return arr[i];
}
}
//-1表示没有具有奇数个数的数
return -1;
}
public static void main(String[] args) {
int[] arr = {
1, 2, 2, 3, 3, 3, 3, 2, 1, 1, 1};
System.out.println("个数为奇数的值:" + ero(arr));
System.out.println("个数为奇数的值:" + hashSelect(arr));
}
}
问题提出:给一串数,求解在这串数当中为奇数位数的数是哪个数
猜你喜欢
转载自blog.csdn.net/qq_35712788/article/details/114240392
今日推荐
周排行