(day05休息)代码随想录算法训练营-day06-242.有效的字母异位词、349. 两个数组的交集、第202题. 快乐数、1. 两数之和

242.有效的字母异位词

  1. 学习文章链接:
  2. 题目分析:
    1. 暂不使用暴力法。
    2. 字母异位意味着两个字符串中的各个字符出现的次数相同。
    3. 使用长度为26的数组进行统计,如果长度不是固定的,则需要使用哈希法。
    4. 使用此数组记录s字符串中出现的次数。所记录的位置即为各字符相对于a的相对值(0 - 25)。
    5. 遍历t字符串中各个字符出现的次数,出现一次,数组中对应位置的数值- 1。
    6. 遍历数组,全部为零即为true。
  3. 代码
class Solution {
    public boolean isAnagram(String s, String t) {
        
        int[] record = new int[26];

        for (int i = 0; i < s.length(); i++) {
            record[s.charAt(i) - 'a']++;
        }
        for (int j = 0; j < t.length(); j++) {
            record[t.charAt(j) - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) return false;
        }
        // for (int count : record) {
        //     if(count != 0) return false;
        // }
        // 此种写法为增强for循环。
        return true;
    }
}
  1. 心得
    1. 还是得勤复习啊

349. 两个数组的交集

  1. 学习文章链接:
  2. 题目分析:
    1. 暂不使用暴力法
    2. 本题的结果是返回交集,那么即不重复,考虑使用set。
    3. set相关知识
名称重复null元素容器是否有序
set1个无序
list多个有序

在这里插入图片描述

  1. 代码
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if (nums1 == null || nums1.length == 0 || nums2 ==null || nums2.length == 0) return new int[0];
        Set<Integer> set = new HashSet<>();
        Set<Integer> res = new HashSet<>();

        for (int i : nums1) {
            set.add(i);
        }
        for (int j : nums2) {
            if (set.contains(j)) {
                res.add(j);
            }
        }
        return res.stream().mapToInt(x -> x).toArray();
    }
}
  1. 心得
    1. 重温了关于set的知识

第202题. 快乐数

  1. 学习文章连接:
  2. 题目分析:
    1. 本题关键在于如果求和,其中个位是要单独处理的。
    2. 处理完各位再求十位、百位、千位等等。这里是最重要的。
    3. set在这里的作用是避免无限循环下去。
  3. 代码:
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();
        while (n != 1 && !record.contains(n)) {
            record.add(n);
            n = getNextNum(n);
        }
        return n == 1;
    }
    private int getNextNum(int n) {
        int sum = 0;
        while (n > 0) {
            sum += (n % 10) * (n % 10);
            n = n / 10;
        }
        return sum;
    }
}
  1. 心得
    1. 关于set的妙用,可以用来避免循环。

1. 两数之和

  1. 学习文章链接:
  2. 题目分析:
    1. 暴力法:即两层for循环。
    2. 使用map,数组中的值为键,索引位置为值。
    3. 两数之和,换种思想就是用target - nums[i]寻求是否在数组中存在
    4. 在进行res数组赋值时,要注意map中存在应该为0位置上的值,因为map中是先进入的。
  3. 代码:
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if (nums == null || nums.length == 0) return res;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if (map.containsKey(temp)) {
                res[0] = map.get(temp);
                res[1] = i;
            }
            map.put(nums[i], i);
        }
        return res;
    }
}
  1. 心得:
    1. 关于map的方法名不是很熟悉。
    2. 细节方面:比如结果数组的赋值没有搞清楚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值