算法训练第四天 —— 有效的字母异位词、两个数组的交集、两数之和

79 阅读2分钟

重点:int s = 'a' s=97

242. 有效的字母异位词

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

解题思路:首先要知道int s = 'a' s=97

是否出现两次,那就反过来考虑唯一性。唯一性可通过Map这个集合来考虑。同时也可以通过数组的位置的值来处理。

   public static boolean isAnagram(String s, String t) {
         int[] record = new int[26];
         for (int i = 0; i < s.length(); i++) {
             record[s.charAt(i) - 'a'] = 1;
         }
         for (int i = 0; i < t.length(); i++) {
             record[t.charAt(i) - 'a'] = 2;
         }
         for (int i : record) {
             System.out.println("值 = " + i);
             if (i == 1){
                 return false;
             }
         }
         return true;
     }

错误点:1. 确保需要保证s的长度大于t的长度 同时 s="aa" t="a"的时候不能判断,需要利用加减法来做,不能用单独赋值

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

349. 两个数组的交集

给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

解题思路:主要考虑的唯一性:唯一性就是利用集合的特性,比如map、set等,这里有set的元素具有唯一性。

  public int[] intersection(int[] nums1, int[] nums2) {
         HashSet<Integer> set1 = new HashSet<>();
         HashSet<Integer> set2 = new HashSet<>();
         for (int i = 0; i < nums1.length; i++) {
             set1.add(nums1[i]);
         }
         for (int j = 0; j < nums2.length; j++) {
             int k = nums2[j];
             if (set1.contains(k)) {
                 set2.add(k);
             }
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             return set2.stream().mapToInt(value -> value.intValue()).toArray();
         }
         return null;
     }

1 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法

  public int[] twoSum(int[] nums, int target) {
         int[] result = new int[2];
         if (nums == null || nums.length <= 0) return result;
 ​
         Map<Integer, Integer> map = new HashMap<>();
         for (int j = 0; j < nums.length; j++) {
             int plus = target - nums[j];
             if (map.containsKey(plus)) {
                 result[0] = j;
                 result[1] = map.get(plus);
             }
             map.put(nums[j], j);
         }
         return result;
     }