查找数组中出现次数为奇数的一个数

查找数组中出现次数为奇数的一个数

约束:一个数组,只有一个数值出现次数为奇数

使用同一个数异或本身结果为0性质,代码如下:

/**
* 查找数组中出现次数为奇数的一个数
* @param arr
*/
private static int test1(int[] arr) {
int result = 0;
for (int j : arr) {
result ^= j;
}
return result;
}

使用hashmap辅助验证,代码如下:

/**
* hashmap方式
* 查找数组中出现次数为奇数的一个数
* @param arr
*/
private static int test1HashMap(int[] arr) {
HashMap<Integer, Integer> map = new HashMap<>();

for (int num : arr) {
if (map.containsKey(num)) {
map.put(num, map.get(num) + 1);
} else {
map.put(num, 1);
}
}
for (int num : map.keySet()) {
if (map.get(num) % 2 != 0) {
return num;
}
}
return -1;
}

准备生成数组的对数器:

/**
* 对数器
* @param max 最大值
* @param k 出现次数为奇数的个数
* @param m 出现次数为偶数的个数
* @return
*/
private static int[] randomArray(int max, int k, int m) {
// 记录每个奇数出现的次数
ArrayList<Integer> oddKinds = new ArrayList<>();
// 记录每个偶数出现的次数
ArrayList<Integer> evenKinds = new ArrayList<>();
// 生成出现k个奇数
int valueK;
// 生成每个奇数出现的次数
// 计算数组长度
int len = 0;
while (k != 0) {
do {
valueK = (int) (Math.random() * max + 1);
} while (valueK % 2 == 0);
k--;
len += valueK;
oddKinds.add(valueK);
}
// 生成每个偶数出现的次数
while (m != 0) {
do {
valueK = (int) (Math.random() * max + 1);
} while (valueK % 2 != 0);
m--;
len += valueK;
evenKinds.add(valueK);
}

int[] arr = new int[len];
HashSet<Integer> set = new HashSet<>();
// 添加奇数
int index = 0;
index = addArr(max, oddKinds, arr, set, index);
// 添加偶数
addArr(max, evenKinds, arr, set, index);

// 打乱数组顺序
for (int j = 0; j < arr.length; j++) {
int index1 = (int) (Math.random() * arr.length);
int temp = arr[j];
arr[j] = arr[index1];
arr[index1] = temp;
}

return arr;
}

private static int addArr(int max, ArrayList<Integer> oddKinds, int[] arr, HashSet<Integer> set, int index) {
int valueK;
for (Integer oddKind : oddKinds) {
do {
valueK = randomNumber(max);
} while (set.contains(valueK));
set.add(valueK);
for (int integer = 0; integer < oddKind; integer++) {
arr[index] = valueK;
index++;
}
}
return index;
}

/**
* 生成随机数
* @param range
* @return
*/
private static int randomNumber(int range) {
return ((int) (Math.random() * range) + 1) - ((int) (Math.random() * range) + 1);
}

验证,这里只验证了一次,感兴趣的小伙伴可以写个循环验证一下:

public static void main(String[] args) {
// test1(new int[]{2, 3, 4, 2, 4, 5, 5, 5, 4, 4, 3, 2, 2});

int[] arr = randomArray(1000, 1, 20);
for (int j : arr) {
System.out.print(j + ", ");
}
System.out.println();
System.out.println(test1(arr));
System.out.println(test1HashMap(arr));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

91老码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值