参考评论区解法
方法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又不一定是顺序的,再说你也不知道从哪开始的
方式三:位运算 这个缓缓,这道题又是几个小时......