首页 > 其他分享 >有效的字母异位词&两个数组的交集& 快乐数& 两数之和

有效的字母异位词&两个数组的交集& 快乐数& 两数之和

时间:2023-02-12 17:44:06浏览次数:53  
标签:set 下标 交集 异位 ret int 遍历 数组 两数

一、有效的字母异位词

242. 有效的字母异位词

1.方法概述

  • 因为本题中字符串只包含小写字母,就可以定义一个数组来记录字符串中字符出现的次数。遍历第一个字符串,用charAt拿到对应的小写字母然后减去'a'对应的ASCII值,得到一个相对数下标即可,然后对应下标的数组值++。同理另一个字符串采用--。最后遍历数组中是否存在不为0的元素,存在则说明两字符串中的字母出现的频率一定是不相同的。

2.具体实现

Java实现

点击查看代码
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] arr = new int[26];
        for(int i=0;i<s.length();i++){
            arr[s.charAt(i)-'a']++;
        }

        for(int j = 0;j < t.length();j++){
            arr[t.charAt(j)-'a']--;
        } 

        for(int num : arr){
            if(num != 0){
                return false;
            }
        }
        return true;
    }
}

3.要点总结

  • 首先判断的是字母,字母的ASCII值在一定范围内是连续的,因此可以很好的对应数组下标。
  • 其次是通过数值下标对应值的加减操作来统计字符串中字母出现的频率是否相等。

二、两个数组的交集

349. 两个数组的交集

1.方法概述

  • 由于本题要求输出结果元素唯一,可以使用Set来解决本题的交集问题。首先创建一个遍历第一个数组,将其不重复的值存入到创建的set中。再遍历第二个数组,将其与set中包含的元素进行比较,如果相同则存入到创建的resultSet中,最后将reslutSet中的元素遍历转存到数组中输出。

2.具体实现

Java实现

点击查看代码
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums1) {
            set.add(num);
        }
        Set<Integer> resultSet = new HashSet<>();
        for (int num : nums2) {
            if (set.contains(num)) {
                resultSet.add(num);
            }
        }
        int[] result = new int[resultSet.size()];
        int i = 0;
        for (int num : resultSet) {
            result[i++] = num;
        }
        return result;
    }
}

3.要点总结

  • 输出结果中的每个元素唯一,也就是去重,且不考虑输出顺序,此时就联想到集合Set不包含重复元素的集合这一特性来解决。
  • Set集合中的元素需要使用增强for来遍历取出。

三、快乐数

202. 快乐数

1.方法概述

  • 首先考虑的是创建一个集合set来存放出现过的数字拆解平方之和,如果再次出现则证明该数字不是快乐数,因为重复出现必然会导致无限循环变不到1。接下来考虑如何拆分数字,我们可以使用一个while循环来重复这个过程,条件是这个数值是大于0的(题目要求快乐数是一个正数)。首先模取余,平方求和,然后再将n除去上一位数,再模取余平方求和。然后用while循环将每次求和数字进行判断是否符合不等于1且set集合不包含该数字的要求,如果不符合返回false,否则返回true。

2.具体实现

Java实现

点击查看代码
class Solution {
    private int getNextNumber(int n){
        int ret = 0;
        while(n>0){
            int tmp = n%10;
            ret += tmp*tmp;
            n = n/10;
        }
        return ret;
    }

    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while(n != 1 && !set.contains(n)){
            set.add(n);
            n = getNextNumber(n);
        }
        return n == 1;
    }
}

3.要点总结

  • 一是要如何分解数字,%模是取余数,/是除取上一位上的数字。
  • 如何判断该数字在求和过程中是否会重复出现。

四、两数之和

1. 两数之和

1.方法概述

  • 本题既要查询数组值是否匹配,又要返回下标。我们可以考虑使用Map集合来解决该问题。因为返回的是数组类型的两个数值,这里我们定义一个大小为二的数组ret来存储结果。当数组为空时直接返回ret。接下来创建一个map,通过for循环来遍历目标值在数组中的由那两个数组成,且当前值和目标值的差值是否在之前遍历时出现过,如果没有则存入到map中,来存放下标当前遍历元素的值和下标。如果已近存在则将当前下标和差值下标存放到ret中然后break。最后返回ret。

2.具体实现

Java实现

点击查看代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] ret = new int[2];
        if(nums == null || nums.length == 0) return ret;
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i<nums.length;i++){
            int tmp = target - nums[i];
            if(map.containsKey(tmp)){
                ret[1] = i;
                ret[0] = map.get(tmp);
                break;
            }
             map.put(nums[i],i);
        } 
        return ret;
    }
}

3.要点总结

  • 为什么会使用Map来解决该问题?因为本题既要求查询该值是否满足条件同时又要返回下标,且要能去重,Map的特性正好满足。
  • 本题的map中的key用来存下标i,value用来存数组中i对应的值。

仅供个人学习参考,欢迎批评指正。

标签:set,下标,交集,异位,ret,int,遍历,数组,两数
From: https://www.cnblogs.com/neverlate/p/17114321.html

相关文章