代码随想录 打卡06

58 阅读2分钟

242.有效的字母异位词

力扣

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

暴力解法的思路就是直接建两个HashMap,然后将字符串遍历,将结果保存到hashMap中,再比较HashMap。

另外一种解法是创建一个26位的数组,然后数组的下标就对应到字母,这里就是将数组看作一个hash表,只不过key是固定的index.这个思路可以用在大部分数量有限的key中。

public boolean isAnagram2(String s, String t) {
        int[] alphabet = new int[26];
        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 : alphabet) if (i != 0) return false;
        return true;
    }

349. 两个数组的交集

力扣

给定两个数组,求两个数组中包含的相同的元素

public int[] intersection(int[] nums1, int[] nums2) {

        HashSet<Integer> set = new HashSet<>();
        HashSet<Integer> result = new HashSet<>();
        for(int i : nums1) {
            set.add(i);
        }

        for(int i : nums2) {
            if(set.contains(i)) {
                result.add(i);
            }
        }

        return result.stream().mapToInt(i -> i).toArray();

    }

202. 快乐数

力扣

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

「快乐数」 定义为:

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

题目中提到可能出现无限循环,那么我们就需要注意,不能去一直计算,而是要在合适的时候退出。这里可以用一个set做记录,一旦某个值出现过,即表示出现了循环了,那么我们就应该要退出了,不需要再继续做计算了

 public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        int num1 = n;

        boolean result = false;
        while(true) {
            int nextNum = getNextNumber(num1);

            if(nextNum != 1) {
                if(set.contains(nextNum)) {
                    break;
                }
                set.add(num1);
                num1 = nextNum;
            } else {
                result = true;
                break;
            }
        }

        return result;
    }

    private int getNextNumber(int n) {
        int res = 0;
        while (n > 0) {
            int temp = n % 10;
            res += temp * temp;
            n = n / 10;
        }
        return res;
    }

1. 两数之和

力扣

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

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

这道题还说印象比较深刻的,面试的时候做过。关键的地方在于,在循环遍历数组的时候,不需要去考虑后面的元素,只需要去看总数减去当前值是否曾经出现过。还有需要注意相同值的问题。

public int[] twoSum(int[] nums, int target) {

        Map<Integer, Integer> map = new HashMap<>();
        map.put(nums[0], 0);
        int[] result = new int[2];

        for(int i =  1; i <  nums.length; i++) {

            if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i) {
                result[0] = map.get(target - nums[i]);
                result[1] = i;
                return result;
            } 
            map.put(nums[i], i);
        }
        return result;

    }