小白视角刷leetcode (242. 有效的字母异位词、349. 两个数组的交集、 202. 快乐数、1. 两数之和)

文章介绍了使用哈希表解决编程挑战的四种情况:判断字母异位词、找到两个数组的交集、判断快乐数以及寻找数组中和为目标值的两个数。这些方法利用了哈希表的特性,例如检查元素出现次数、存储唯一元素和快速查找。
摘要由CSDN通过智能技术生成

在求解某个元素是否在另一个表中存在时,第一时间想到用哈希表,然后根据具体问题考虑具体用哪一种hash结构

242. 有效的字母异位词


给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

思路:
    1.核心是判断s字符串中每个字符出现的次数与t字符串中每个字符出现的次数是否相同
    2.因此创建一个数组,该数组长度为26,用来存放s字符串字母出现的次数,用数组索引对应字母
    3.遍历s字符串,把s字符串中出现的字母在数组中++
    4.遍历t字符串,把t字符串中出现的字母在数组中--
    5.最后遍历数组,如果数组中有不为0的元素,则返回false
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] arr = new int[26];//int型数组,
        for(int i = 0 ; i < s.length() ; i++){
            arr[s.charAt(i)-'a']++; //这里是查看s.charAt,而不是arr.charAt
        }
        for(int i = 0 ; i < t.length() ; i++){
            arr[t.charAt(i)-'a']--;
        }
        for(int i = 0 ; i < arr.length ; i++){
            if(arr[i] != 0) return false;
        
        }
        return true;
​
    }
}

349. 两个数组的交集


给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

思路:
    1.因为要求结果中每个元素都是唯一的,因此用set集合
    2.遍历num1,把遍历到的元素输入到set1集合中
    3.遍历num2,判断遍历到的元素是否存在于set1中
    4.如果存在于set1中,则该元素为相交元素,因此把该元素存入另一个set集合中(因为题目要求结果集不能有重复元素)
    5.return结果集:需要把set集合转化成数组,可以新建一个数组,然后遍历set2,输入到新数组中,最后返回数组
    
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set =new HashSet();
        Set<Integer> set1 = new HashSet();
  
        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])){
                set1.add(nums2[i]);
            }
        }
    int[] arr = new int[set1.size()];
        int j = 0 ;
        for(int i : set1){
            arr[j++]=i;
        
        }
        
        return arr;
    }
}

202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。


「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 

思路:
    1.根据题目,需要定义一个返回值类型为boolean的函数,同时也需要另一个函数用于确定下一个n的数值
    2.题目中说数字可能无限循环或者最终变成1,因此需要用到哈希结构,如果数字出现的重复,则代表一定陷入的循环,因为一旦某个数字一样,后边的数字也一定一样
    3.把获取到的数字放到set中,判断是否已经存在,如果不存在则继续获取下一个数字,如果不满足while则跳出循环,即n=1或遇到循环,此时跳出循环,判断n是否为1,直接return n == 1;如果等于1会直接返回true,否则返回false
class Solution {
    public boolean isHappy(int n) {
        Set set = new HashSet();
        while(n != 1  && !set.contains(n)){
            set.add(n);
            n = getNext(n);
        }
        return n ==1;
    }
    
    public int getNext(int n){
        int sum = 0;
        while(n > 0){
             int tmp = n % 10;
             sum += tmp*tmp;
             n = n / 10;
        }
        return sum;
    }
}

1. 两数之和


给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

思路:
    1.因为本题是需要找到元素以及索引下标,需要按键值对存储,因此需要用到hash结构中的map
    2.判断目标值减去nums数组里的元素,是否已经遍历过,如果已经遍历过,则返回当前nums数组的索引,以及target-nums[i]的索引,如果没有遍历过,则把当前遍历的nums元素插入到map中
    3.对nums的遍历结束后,如果遍历时没有return,则代表没有找到符合条件的内容,因此返回一个new的空数组
    
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();//这里要使用泛型限制,否则在map.get索引时,会报错(object无法转换成int)
        for(int i = 0 ;i < nums.length ; i++){
            if(map.containsKey(target-nums[i])){
                return new int[]{map.get(target-nums[i]),i};
            }
            map.put(nums[i],i);
        }
        return new int[0];
    }
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值