方法一:利用异或手段来解决
1. 归零律:a ^ a = 0
2. 恒等律: a ^ 0 = a
3. 交换律:a ^ b ^ c<=>b ^ c ^ a
4. 自反:a ^ b ^ a = b
例如:var a = [2,5,1,2,1],2 ^ 5 ^ 1 ^ 2 ^ 1=2 ^ 2 ^ 1 ^ 1 ^ 5=0 ^ 0 ^ 5
题解如下:
class Solution
{
public int singleNumber(int[] nums)
{
int a = nums[0];
if(nums.length>1)
{
for(int i = 1; i<nums.length;i++)
{
a=a^nums[i];
}
}
return a;
}
}
方法二:对比法
思路:将输入数组的值分配给另一个数组,并记录数的出现频率,只需输出出现频率为二的数
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; // 输入数组
Map<Integer, Integer> frequencyMap = new HashMap<>(); // 用于记录频率的Map
// 遍历输入数组,计算频率并分配值到新数组
for (int num : arr) {
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}
// 输出频率为二的数
for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
if (entry.getValue() == 2) {
System.out.println("Number: " + entry.getKey() + ", Frequency: " + entry.getValue());
}
}
}
}
ps:方法二的代码没有进行验证,可以提供一个思路进行参考