代码随想录|day6打卡(有效的字母异位词、两个数组的交集、快乐数、两数之和)

242.有效的字母异位词

题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(异位词指的是两个单词里面的字母都要一致)。
思路:

  • 遍历第一个字符串,用map来记录字母及其出现的次数
  • 遍历第二个字符串,出现一致的,value就减一
  • 技巧:由于是字母,最多只有26个,可以直接用数组来当map来使用
class Solution {
    public boolean isAnagram(String s, String t) {
        // 和字母有关系 直接用数组来当map
        int[] map = new int[26];

        for(int i = 0;i < s.length();i++){
            char tmp = s.charAt(i);
            map[tmp - 'a']++;
        }
        for(int i = 0;i < t.length();i++){
            char tmp = t.charAt(i);
            map[tmp - 'a']--;
        }

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

    }
}

349.两个数组的交集

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

  • 返回交集,由于不能重复返回,所以用一下map来记录值
  • 观察到值的大小在1000以内,所以还可以使用数组来作为map
  • 当然用set也可以,但是最后的return要求是返回数组,那么如何遍历set?
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 判断是否可以使用数组来当hash表,主要看题目给的范围,这里数组的范围是1000,可以使用
        int[] map = new int[1001];
        List<Integer> list = new LinkedList<>();

        for(int i = 0;i < nums1.length;i++){
            if(map[nums1[i]] == 0){
                map[nums1[i]]++;
            }
        }
        for(int i = 0;i < nums2.length;i++){
            if(map[nums2[i]] == 1){
                list.add(nums2[i]);
                map[nums2[i]] = 0;
            }
        }
        int[] res = new int[list.size()];
        for(int i = 0;i < list.size();i++){
            res[i] = list.get(i);
        }

        return res;


    }
}

202.快乐数

题目描述:编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

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

思路:

  • 题目的关键是如何处理最后的无限循环?或者我们什么时候可以认为它是无限循环的,然后可以退出?
  • 当同一平方出现两次的时候,他们就一定会循环下去,所以就直接false。所以使用set来记录是否重复
class Solution {
    public boolean isHappy(int n) {
        // 开始没思路,不知道如何处理无限循环
        // 可以使用一个hash表来进行处理,如果一个结果出现了第二次,肯定就是不行的
        HashSet<Integer> set = new HashSet<>();

        int sum = n;
        while(sum != 1){
            sum = getNext(sum);
            if(set.contains(sum)){
                return false;
            }else{
                set.add(sum);
            }
        }
        return true;
    }

    public int getNext(int n){
        int sum = 0;
        while(n != 0){
            int tmp = n%10;
            n = n/10;
            sum += tmp * tmp;
        }
        return sum;
    }
}

1. 两数之和

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

  • 需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合
  • 为什么要用map?这里要求返回的是数组下标,所以需要用map来存一下下标的值
class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 一定会存在一个有效答案
        // 暴力直接两遍循环
        // 使用hash表来记录,用空间来换时间
        // 这里由于要返回索引值,所以要用map来记录,<key,value> = <值,索引>
        int[] res = new int[2];
        HashMap<Integer,Integer> map = new HashMap<>();

        for(int i = 0;i < nums.length;i++){
            int need = target - nums[i];
            if(map.containsKey(need)){
                res[0] = map.get(need);
                res[1] = i;
            }else{
                map.put(nums[i],i);
            }
        }

        return res;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值