NC156 数组中只出现一次的数(其它数出现k次)

参考评论区解法

方法1

首先进行排序,然后相邻比较,相同则当前比较的数往后走(k-1步),因为有k个相同的数,不同则直接返回当前元素

不理解的时候,debug一遍,看看变量值的变化

public int foundOnceNumber(int[] arr, int k) {
      Arrays.sort(arr);
//i<arr.length-1,再往后走,arr[i+1]越界
      for(int i = 0; i<arr.length-1; i++){
//相同走k-1步
          if(arr[i]==arr[i+1]){
              i += k-1;
          }
//不同直接返回当前数
          else
          {
              return arr[i];
          }
 
      }
//当只出现一次的数
      return arr[arr.length-1];
  }

方法二   Hashmap     

关于hashmap    存储键值对(key-value)    value可以相同,key不行

如果插入的 key 对应的 value 已经存在,则执行 value 替换操作,返回旧的 value 值,如果不存在则执行插入,返回 null。集合什么的都忘了

hashmap只能通过key找value,无法通过value找key,set是无序不重复的数据

将key保存在set中,然后取map中的value为false的值,再返回索引key

以上供自己复习

代码如下:


public int foundOnceNumber (int[] arr, int k) {
        // write code here
       HashMap<Integer,Boolean> map = new HashMap<>();
    for(int num:arr)
    {
        if(map.containsKey(num))
        {
            map.put(num,true);//再次出现重置为true,hashmap不存储重复的key
        }
        else
        {
            map.put(num,false);//首次出现置false
        }
    }
       Set<Integer> set = map.keySet();
    for(int num:set)
    {
        if(map.get(num)==false)
            return num;
    }
    return 0;
    }

为什么不直接for循环遍历,因为key又不一定是顺序的,再说你也不知道从哪开始的

方式三:位运算  这个缓缓,这道题又是几个小时......

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_40396568

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

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

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

打赏作者

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

抵扣说明:

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

余额充值