代码随想录Day6 | 242.有效的字母异位词、349. 两个数组的交集、202.快乐数、1.两数之和

本文介绍了如何使用Java编程解决LeetCode中的四个问题:有效字母异位词检测(利用哈希表统计字符出现次数),两个数组的交集(使用HashSet),快乐数(递归与循环判断),以及两数之和(哈希表辅助找到目标和)。
摘要由CSDN通过智能技术生成

242.有效的字母异位词

题目:242. 有效的字母异位词 - 力扣(LeetCode)

视频讲解:Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili

思路:用哈希表,字符串的字母作为key,出现的次数作为value,先遍历string s,得到hashmap,再遍历string t,每次遍历先判断hashmap有无该字符,没有直接返回false,有的话就把次数-1,遍历循环后,判断最后的hashmap是否为空,为空则返回true

尝试 ( 头一次按照自己的思路写对了❗)
class Solution {
    public boolean isAnagram(String s, String t) {
        Map<Character,Integer> charCountMap = new HashMap<>();
        // 遍历字符串s  
        for (int i = 0; i < s.length(); i++) {  
            char c = s.charAt(i);  
            if (charCountMap.containsKey(c)) {  
                charCountMap.put(c, charCountMap.get(c) + 1);  
            } else {  
                charCountMap.put(c, 1);  
            }  
        }
        for (int i = 0; i < t.length(); i++) {  
            char c = t.charAt(i);  
            if (charCountMap.containsKey(c)&&charCountMap.get(c)>0) {  
                charCountMap.put(c, charCountMap.get(c) - 1);  
            } else {  
                return false;
            }  
        }
        // 遍历HashMap中的所有条目  
        int sum = 0;  
        for (Map.Entry<Character, Integer> entry : charCountMap.entrySet()) {  
            // 累加每个条目的value  
            sum += entry.getValue();  
        }  
        if(sum==0){
            return true;
        }
        return false;
    }
}
收获
  • Java基础知识
    • char c = s.charAt(i); 取出字符串s的第i个字符

    • charCountMap.containsKey(c),判断map里面是否包含c

    • charCountMap.get(c),获取c对应的value

    • charCountMap.put(key,value);  存入key和value到哈希表

    • for (Map.Entry<Character, Integer> entry : charCountMap.entrySet()),遍历哈希表的entry

    • entry.getValue(),获取entry的value

    • record[s.charAt(i) - 'a'],通过 - 'a' 的操作,可以将 a-z 的小写字母映射到数字 0-25

  • 哈希的数据结构,可以用数组,set和map来实现

    • 数据量小,考虑用数组,比如本题

    • 数据量大,考虑用set

    • 要存储键值对,考虑用map

349. 两个数组的交集

题目:349. 两个数组的交集 - 力扣(LeetCode)

视频讲解:Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili

思路:先遍历nums1,把所有出现的数字存到HashSet,之后再遍历nums2,把不在nums2里面的数字从set里面删掉,怎么给数组初始化大小呢?

尝试
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int count = 0;
        HashSet<Integer> set = new HashSet<>();
        HashMap<Integer,Integer> result = new HashMap<>();
        for(int i= 0; i<nums1.length;i++){
            set.add(nums1[i]);
        }
        for(int i= 0; i<nums2.length;i++){
            if(set.contains(nums2[i])&&result.get(nums2[i])!=1){
                result.put(nums2[i],1);
            }
        }
        int[] array = new int[count];
        int i=0;
        for (Integer key : result.keySet()) {
            Integer value = result.get(key);
            array[i++]=value;
        }
        return array;
    }
}
收获
  • 我靠❗可以直接用 set.size() 来获取Set的大小,作为数组的大小
  • 集合可以直接转换为数组
  • return resSet.stream().mapToInt(x -> x).toArray();

202.快乐数

题目:202. 快乐数 - 力扣(LeetCode)

视频讲解:无

思路:每次要拆分数字,再求平方,感觉要递归,要怎么知道是无限循环呢,true的情况岂不是一直出不来了,搞不懂,没有思路,可能是数学上有些信息我读不出来

收获
  • 题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!(我完全没有读出这一层意思)
  • 取出每个位置的数字求平方和
  •     private int getNextNumber(int n) {
            int res = 0;
            while (n > 0) {
                int temp = n % 10;
                res += temp * temp;
                n = n / 10;
            }
            return res;
        }

1.两数之和

题目:1. 两数之和 - 力扣(LeetCode)

视频讲解:Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili

思路:之前刷过这道题,先用Map存储元素和对应下标,遍历数组,每次用target - nums[i]得到gap,判断gap是否在map里面,不再就把当前元素放入map,在的话就返回当前元素下标,以及从map里面取出gap元素的下标

复习
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> temp = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int gap = target - nums[i];
            if(temp.containsKey(gap)){
                return new int[]{i,temp.get(gap)};
            }else{
                temp.put(nums[i],i);
            }
        }
        return null;
    }
}
收获
  • 初始化数组元素要用中括号!:int anOtherArray[] = new int[] {1, 2, 3, 4, 5};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值