【leetcode刷题大作战】本周整理

关键词:HashMap

母题——T205:同构字符串

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

        Map solu=new HashMap<>();

        for(int i=0;i

【leetcode刷题大作战】本周整理_第1张图片
常规思路是哈希表,其实这题还有个蛮有意思的解答,我在评论区看到这个解答时百思不得其解

class Solution {
    public boolean isIsomorphic(String s, String t) {
        char[] ch1 = s.toCharArray();
        char[] ch2 = t.toCharArray();
        int len = s.length();
        for (int i = 0; i < len; i++) {
            if(s.indexOf(ch1[i]) != t.indexOf(ch2[i])){
                return false;
            }
        }
        return true;
    }
}

作者:hao-fei-hao
链接:https://leetcode-cn.com/problems/isomorphic-strings/solution/javake-neng-bi-jiao-jian-dan-de-xie-fa-by-hao-fei-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

实际上,indexOf()返回的是这个字母第一次出现的位置,如果这两个字母第一次出现的位置不相同,大抵上可能是,这两个字母之前出现过(或者一个出现过一个没出现),能循环到这一步那肯定是位置相同的。在这里,这个字母第一次出现的索引,可以分别代表各自的值。实在是妙。
【leetcode刷题大作战】本周整理_第2张图片

T290:单词规律

【leetcode刷题大作战】本周整理_第3张图片
不难发现这是一个两词对应的题目,这样的题目最好是用hashmap啦!

class Solution {
    
    public boolean wordPattern(String pattern, String str) {
        if(pattern.length()==0||str.length()==0)
        {
            return false;
        }//判断有没有空值
        
        String[] splited = str.split(" ");//分词
        if(splited.length!=pattern.length())//如果分词数和标记数不同
            return false;
        
        Map map =new HashMap<>();
        for(int i=0;i

【leetcode刷题大作战】本周整理_第4张图片
内存消耗挺大,没有去深究哪里可以再改进啦。

T961:重复N次的元素

不说废话了,上题目:
【leetcode刷题大作战】本周整理_第5张图片

class Solution {
    public int repeatedNTimes(int[] A) {
        int length=A.length;
        Map solu=new HashMap<>();

        for(int i=0;i keys=solu.keySet();
        //Set set=solu.KeySet();
        Iterator one= keys.iterator();
        while(one.hasNext())
        {
            int key=one.next();
            if(solu.get(key)==length/2)
            return key;
        }
        return 0;
    }
}

这个题乍一看挺简单的,所以我也还是用了hashmap做,字母对应索引值有何不可嘛。
【leetcode刷题大作战】本周整理_第6张图片
可以看到执行用时还是挺长的,思考了一下,因为后面用迭代器什么的太费事了吧。
看看解答有没有大佬相助。
官方给了一个解答,没有太改进,但是让我充分意识到算法学的不好不是因为我算法不好是因为我Java太差。

class Solution {
    public int repeatedNTimes(int[] A) {
        Map count = new HashMap();
        for (int x: A) {
            count.put(x, count.getOrDefault(x, 0) + 1);
        }

        for (int k: count.keySet())
            if (count.get(k) > 1)//仔细看题干,其余的数只出现一次啊!
                return k;

        throw null;
    }
}
这里得备注一下这几个函数的意义:
  1. count.getOrDefault(x, 0)
    如果x的值存在的话,就返回count.get(x),不存在的话就返回0
  2. count.keySet()
    将count转化为set,这样的话,count里的值就会变成唯一的
    这样想了想,我用了那么多迭代器也是白搭。

写到大于1我就发现有什么不对劲了……
现在就来展示一下我的算法改进(挠头

说着是重复N次实际是只要重复了就是啊!!!!!!!!!

class Solution {
    public int repeatedNTimes(int[] A) {
        int length=A.length;
        Map solu=new HashMap<>();

        for(int i=0;i

【leetcode刷题大作战】本周整理_第7张图片
炫耀一下,嘿嘿!

你可能感兴趣的:(leetcode)