代码随想录第十二期集训营-第六天

第五天是整理休息日,今天是新一周第一天,今天的任务是

今天要学习新的内容,哈希法。当需要快速判断一个元素是否在集合内,就可以用哈希法。

242.有效的字母异位词

这题就是判断一个字符串中的每一个元素是否在另一个字符串的元素集合中,并且要求对应的字符数量要相等。哈希法可以用数组、Set、Map来当做集合,这题就可以用数组,是最简单的Hash表。因为元素是连续的26个小写字母,不分散,跨度小,不会造成空间浪费,数组的索引表示相应的字符,索引对应的元素就是字符出现的次数。

这题一个不好想的地方就是怎么把字符放在对应的索引处,我们的英文字母是连续的26个,所以创建一个长为26的int数组,用字符-'a'得到的差就是索引,都不需要知道字母对应的ASCII码。

我们把第一个字符串放进数组中后,遍历第二个字符串,遍历到的字符找到在数组相应位置,然后对索引处元素做减法。都遍历好之后,如果是字母异位词,那这个数组里的元素都应该是零。

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length()){
            return false;
        }

        char[] chs = s.toCharArray();
        char[] cht = t.toCharArray();

        int[] record = new int[26];
        for(int i = 0;i < chs.length;i++){
            record[chs[i] - 'a']++;
        }

        for(int i = 0;i < cht.length;i++){
            record[cht[i] - 'a']--;
        }

        for(int i = 0;i < record.length;i++){
            if(record[i] != 0){
                return false;
            }
        }

        return true;
    }
}

349.两个数组的交集

这题太明显了,就是用哈希法,先把数组A对应元素都放进Set集合中,然后再判断数组B中的元素是否在集合里。因为B输出的元素也是唯一的,所以B中相应的交集元素也要放进一个Set集合中。这题因为限制了元素大小,因此可以用数组作为Hash表,若果不限制就不能用数组,而且如果Hash值比较少,跨度大,分散,就不要用数组了,浪费空间。当然也不能代表所有情况都要用Set,Set也有缺点,空间占用比数组大,而且还需要计算Hash值,速度慢。

1.两数之和

这道题同样也想到要用Hash法,因为我们在遍历数组时,要想到前这个nums[i],它对应的target-nums[i]是否已经遍历过了,如果已经遍历过了,就是找到了目标元素了,并且要得到对应的索引。如果不存在就把当前元素存入集合中,并存入对应的索引。所以还是判断元素是否存在集合中,这个集合存放已经遍历过的元素,而且还有有对应的索引,这就需要Map集合了。Map的key用来存放遍历过的元素,Map的value存放元素对应索引。

202.快乐数

题干里有一句关键,叫可能无限循环始终不能变成1,什么叫无限循环,就是求出的sum可能会再次出行,只要再次出现,就说明不是快乐数。这就好办了,又变成了判断一个元素是否在集合中,这题就是判断当前sum是否出现在之前的sum集合中,出现了就返回false,不是快乐数。可能这题难点在怎么求和,学学就会了。

day06,over!

#2022毕业即失业取暖地##2022毕业生求职现身说法##2022毕业的你对23届的寄语##如何判断面试是否凉了#
全部评论

相关推荐

29 3 评论
分享
牛客网
牛客企业服务