剑指 Offer 56 - I. 数组中数字出现的次数
方法一:纯纯为了正确,此做法不符合题目的要求
class Solution {
public int[] singleNumbers(int[] nums) {
Set<Integer> set=new HashSet<>();
for(int i=0;i<nums.length;i++){
if(set.contains(nums[i])){
set.remove(nums[i]);
}else{
set.add(nums[i]);
}
}
int[] res=new int[2];
int count=0;
for(int x:set){
res[count++]=x;
}
return res;
}
}
方法二:位运算
class Solution {
public int[] singleNumbers(int[] nums) {
//思路:
//第一轮整体遍历,求出a^b(因为相同的数字异或为0,0异或任何数字为数字自身)
//接着从最低位开始找出a^b中第一次出现1的位置,也就是两个只出现一次的数字开始不同的位置
//再次遍历nums数组,根据找到的不同的那个数做与运算根据结果分为两批进行异或运算
int z=0;//相同的数字异或为0,根据此性质初始化为1
for(int num:nums){
z^=num;
}
int p=1;
while((p&z)==0){
p<<=1;
}
int x=0;
int y=0;
for(int num:nums){
//注意优先级
//if(num&p==0){
if((num&p)==0){
x^=num;
}else{
y^=num;
}
}
return new int[]{x,y};
}
}
//知识补充
//&(与)
//| (或)
//~(非)
//^(异或)
//<<(左移)
//>>(右移)
剑指 Offer 56 - II. 数组中数字出现的次数 II
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
if(nums.length==1) return nums[0];
int i=0;
while(i<nums.length-1){
// if((nums[i]^nums[i+2])==1){
if((nums[i]^nums[i+2])!=0){
break;
}else{
i=i+3;
}
}
return nums[i];
}
}
方法二:
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
int res=0;
for(int x:nums){
if(map.get(x)==1){
res=x;
break;
}
}
return res;
}
}