[代码随想录] 第五天

242.有效的字母异位词https://leetcode.cn/problems/valid-anagram/description/
思路:做一个基础版哈希表,哈希函数为key-'a',这样两个字符串的每个字母都会映射在26长的数组中,使用数组自增记录字母出现次数。

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

-----------------------分割线-------------------------


349. 两个数组的交集 https://leetcode.cn/problems/intersection-of-two-arrays/
思路:使用set,了解set特性与方法。注意set没有get()方法,所以便利set方式比较特殊。


class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1==null ||nums2==null){
            return null;
        }
       Set<Integer> set1 = new HashSet<>();
       Set<Integer> ansSet = new HashSet<>();
       for(int i = 0;i<nums1.length;i++){
           set1.add(nums1[i]);
       }
       for(int i = 0;i<nums2.length;i++){
           if(set1.contains(nums2[i])){
               ansSet.add(nums2[i]);
           }
       }
       int[] ansInt = new int[ansSet.size()];
       int index =0;
       for(int i:ansSet){
           ansInt[index] =i;
           index++; 
       }
        return ansInt;
    }
}

-----------------------分割线-------------------------

202.快乐数https://leetcode.cn/problems/happy-number/submissions/495689567/
思路:难点①:n的取值范围为int范围,所以要依次取每一位数平方和相加,我使用的是String.charAt()-'0'取得char的每一个int值,较为罗嗦麻烦。
-------改进①:因为取每一位平方和,所以从高位取地位取都可以,可以使用while(n%10>0)的方式取得。
-------难点②:如果平方和重复出现一次,后续就会出现死循环,就绝对不是快乐数,可以直接返回false;所以每次可以将结果加入set中,判断是否重复,知道重复或符合快乐数条件。

class Solution {
    public boolean isHappy(int n) {

        Set<Integer> set01 = new HashSet<>();
        String s = "";
        int sum = n;
        while (true) {
            s = "";
            s += sum;
            sum = 0;
            for (int i = 0; i < s.length(); i++) {
                sum += (int) (s.charAt(i) - '0') * (int) (s.charAt(i) - '0');
            }
            if (sum == 1) {
                return true;
            }

            if (set01.contains(sum)) {
                return false;
            }
            set01.add(sum);
        }
    }
}

-----------------------分割线-------------------------
1. 两数之和https://leetcode.cn/problems/two-sum/description/
思路:使用Map,遍历数组,对元素判断target-nums[i]是否在Map中,若不存在则将该元素接入Map中,判断下一元素,若存在,则返回当前元素索引与Map中的索引。
难点:理解并使用Map的方法。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] ans = new int[2];
        if (nums == null || nums.length == 0) {
            return ans;
        }
        Map<Integer, Integer> map = new HashMap<>();
        int x = 0;
        for (int i = 0; i < nums.length; i++) {
            x = target - nums[i];
            if (map.containsKey(x)) {
                ans[0] = i;
                ans[1] = map.get(x);
                break;
            } else {
                map.put(nums[i], i);
            }
        }
        return ans;
    }
}
posted @ 2024-01-15 15:48  糟糕的家伙  阅读(8)  评论(0)    收藏  举报