算法:数组中数字出现的次数
问题
- 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
解决
//1、利用hashset的特性进行判断
class Solution {
public int[] singleNumbers(int[] nums) {
int len1=nums.length;
if(len1==2) return nums;
HashSet<Integer> set=new HashSet<Integer>();
// for(int i=0;i<len1;i++){
// if(!set.contains(nums[i])){
// set.add(nums[i]);
// }else{
// set.remove(nums[i]);
// }
// }
int left=0,right=len1-1;
while(left<=right){
if(nums[left]==nums[right]){
left++;
right--;
continue;
}
if(!set.contains(nums[left])){
set.add(nums[left]);
}else {
set.remove(nums[left]);
}
if(!set.contains(nums[right])){
set.add(nums[right]);
}else{
set.remove(nums[right]);
}
left++;
right--;
}
int[] arr=new int[2];
int a=0;
for(int j:set){
arr[a++]=j;
}
return arr;
}
}
//2、通过异或操作获取值
class Solution {
public int[] singleNumbers(int[] nums) {
int ret = 0;
for (int n : nums) { //得到两个子出现1次的值的异或值:此时结果中的位上的1表示两数原本位置上是不同的值
ret ^= n;
}
int div = 1;
while ((div & ret) == 0) { //提取出最右边的1
div <<= 1; //将1左移一位,=》0010。。。从而得到ret最右边的1
}
int a = 0, b = 0;
for (int n : nums) { //能够将两个出现1次的分到不同的两组(因为他们在div对应得位置不同),相同的数分到一组(在div对于得位置上相同)!
if ((div & n) != 0) { //第一组
a ^= n;
} else {
b ^= n; //第二组
}
}
return new int[]{a, b};
}
}
总结
- 第二种方式更优
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通