剑指-数组中数字出现的次数-hash用法和小细节

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
要求时间复杂度是O(n),空间复杂度是O(1)。

思路

空间复杂度要求不能用map了(O(n)),暴力更不想了(O(n^2))。

一、正解:分组异或。链接如下。
大佬分组异或做的

二、不管要求,就只会map。练练也行。

小细节:
1、hashmap.getOrDefault(x,y)
x,y类型自定,意思x存在keySet()里就获得对应value,x不存在就默认给个y。
2、int[] 和 int 动态创建时(int[] a = new int[n]),默认为所有元素都为0。而不是字符串的null。简单但最开始忽视了。

代码

HashMap版 非正解

class Solution {
    public static int[] singleNumbers(int[] nums) {
        int[] res = new int[2];
        HashMap<Integer, Integer> hashmap = new HashMap<>();
        for(int i =0; i<nums.length; i++){
            hashmap.put(nums[i], hashmap.getOrDefault(nums[i],0)+1);
        }
        for(Map.Entry<Integer, Integer> map : hashmap.entrySet()){
            if(map.getValue() == 1){
            	if(res[0] == 0) {
                	res[0] = map.getKey();
            	}
            	else if(res[1] == 0) {
                	res[1] = map.getKey();
            	}
            }
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值