LeetCode题目列表:

java一次执行多个删除 java只执行一次_算法

一,实例一

题目:

java一次执行多个删除 java只执行一次_java_02


答案:

这道题有好几种解决方法,先看下第一种,使用HashSet, HashSet中不允许有重复的值

class Solution {
    public int singleNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int num:nums){
            //将当前元素加入到set中,set中不允许有重复的元素
            boolean flag = set.add(num) 
            //如果set中已经存在num这个元素,那么前面的添加就是失败的,返回false
            if(!flag){
                set.remove(num); //将数组中重复的元素,从set集合中移除
            }
        }
        //set集合中只剩下数组中唯一出现的元素
        return set.iterator().next(); //返回set序列中的第一个元素
    }
}

第二种方法就是按位异或,一个值和0进行按位异或操作所得为该值,相同的两个值进行异或操作,所得为0(甲 按位异或 0 得 甲,甲 按位异或 甲 得 0)。

根据这个性质,由于每个重复元素重复两次,故他们在遍历后将相互抵消,而唯一元素只出现一次,故将得到保留

class Solution {
    public int singleNumber(int[] nums){
        int singleNum = 0;
        for(int num:nums){
            //一个值和0进行按位异或操作所得为该值,相同的两个值进行异或操作,所得为0
            singleNum ^= num;
        }
        return singleNum;
    }
}

以上只是简单的程度,下面来个该题的变式,中等难度

二,实例二

题目:

java一次执行多个删除 java只执行一次_leetcode_03


答案:

这题不适合使用按位异或的方法,因为给出的数组中有两个数在数组中是唯一的。这里采用HashSet实现

class Solution {
    public int[] singleNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int num : nums){
            if(!set.add(num)){
                set.remove(num);
            }
        }
        int[] arr = new int[2];
        int i=0;
        for(int num : set){ //遍历set中的每一个元素
            arr[i++] = num;
        }
        return arr;
    }
}

三,实例三

题目:

java一次执行多个删除 java只执行一次_java_04


思路:

注意该题和前面不同的是,除了唯一元素,其余元素出现的次数为3,而不是2,所以不能用HashSet。eg:{2, 2,3, 2},按照之前用HashSet的方法,第一次出现2时,将其添加到set中,当第二次出现2时时,先判断能不能添加成功,如果不行,说明set中已经存在该元素,于是把该元素删除;现在set中已经不存在2这个元素了;当第三次出现2时,又把2添加到了set中,所以set中最终存储了两个元素2和3,实际上2是不符合,所以这题不能用HashSet来实现,而是用HashMap

答案:

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        //主键存数组元素,主键对应的值为该主键出现的次数
        for(Integer num : nums){
            Integer count = map.get(num); //通过get(num),获取主键为num对应的值
            //如果不存在主键为num的值,则将count==1;如果存在,直接在原基础上+1
            count = (count==null) ? 1 : ++count; 
            map.put(num,count); //键值对存入map中
        }
        for(Integer key : map.keySet()){
            if(map.get(key) == 1){  //找到数组中只出现过一次的值
                return key;
            }
        }
        return -1;
    }
}