代码随想录训练营二刷第六天 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

代码随想录训练营二刷第六天 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

一、 242.有效的字母异位词

题目链接:https://leetcode.cn/problems/valid-anagram/
思路:字母有限,用数组存放即可

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) return false;
        int[] nums = new int[26];
        for (int i = 0; i < s.length(); i++) {
            nums[s.charAt(i) - 'a'] += 1;
        }
        for (int i = 0; i < t.length(); i++) {
            nums[t.charAt(i) - 'a'] -= 1;
        }
        for (int i : nums) {
            if (i != 0) {
                return false;
            }
        }
        return true;
    }
}

二、 349. 两个数组的交集

题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/
思路:数组范围太多,定长数组浪费空间,使用hashset去重再求交集。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        HashSet<Integer> set1 = new HashSet<>();
        HashSet<Integer> set2 = new HashSet<>();
        for (int i : nums1) {
            if (!set1.contains(i)) {
                set1.add(i);
            }
        }
        for (int i : nums2) {
            if (set1.contains(i)) {
                set2.add(i);
            }
        }
        
        int[] result = new int[set2.size()];
        Object[] array = set2.toArray();
        for (int i = 0; i < array.length; i++) {
            result[i] = (int)array[i];
        }
        return result;
    }
}

三、 202. 快乐数

题目链接:https://leetcode.cn/problems/happy-number/
思路:数的每一位平方和求和,然后再这样,只要出现的数再出现一次,就一定还会出现,因为第一次出现和第二次出现之间的求和方式是固定的,再分开再求和也就还是一样的,另外求每一个位置上的数,可以从尾部取余,然后整除截取尾部。

class Solution {
    public boolean isHappy(int n) {
        HashSet<Integer> set = new HashSet<>();
        while (true) {
            int i = computer(n);
            if (i == 1) {
                return true;
            }else {
                if (set.contains(i)) {
                    return false;
                }else {
                    set.add(i);
                    n = i;
                }
            }
        }
    }

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

四、 1. 两数之和

题目链接:https://leetcode.cn/problems/two-sum/
思路:有map存,值和索引,边存入边寻找。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int[] result = new int[2];
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if (map.containsKey(temp)) {
                result[0] = i;
                result[1] = map.get(temp);
                return result;
            }
            map.put(nums[i], i);
        }
        return new int[2];
    }
}

你可能感兴趣的:(力扣算法题,数据结构,算法)