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

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

时间:2024-06-12 22:58:59浏览次数:12  
标签:set return int 异位 day05 num 数组 new 两数

有效的字母异位词

题目链接:242. 有效的字母异位词

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

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

思路:由于s和t都是由26个小写字母构成,数量很少,直接定义一个26空间的数组即可

数组下标:表示每个字母,0-'a',1-'b'...等

每个下标对应的数字:表示s字符串和t字符串中某字母出现的次数之差

若数组中的数字都是0,则为true;否则,返回false;

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] arrs = new int[26];
        for(char ch : s.toCharArray())
            arrs[ch - 'a']++;
        for(char ch : t.toCharArray())
            arrs[ch - 'a']--;
        for(int num : arrs)
            if(num != 0)return false;
        return true;
    }
}

两个数组的交集

题目链接:349. 两个数组的交集

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

思路:本题要求输出结果每个元素是唯一的,明显需要有去重操作,所以可以定义两个set来解决。

set1:用于保存nums1数组中的唯一元素

set2:用于保存nums1和nums2两数组交集的唯一元素

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();
        for (int num : nums1) 
            set1.add(num);

        for (int num : nums2) 
            if (set1.contains(num)) 
                set2.add(num);
        
        int [] result = new int[set2.size()];
        int index = 0;
        for (int num : set2) {
            result[index++] = num;
        }
        return result;
    }
}

其实本题也可以用一个数组和一个set来完成,用时更短!!

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        int[] arr = new int[1001];
        //将nums1出现的数字赋值为1,相当于另类的去重了
        for(int num : nums1)
            arr[num] = 1;

        for(int num : nums2)
            if(arr[num] != 0)//表示num是两数组的交集元素
                set.add(num);//set会自动去重
        
        // return set.stream().mapToInt(x -> x).toArray();//耗时3s,空间42.42

        int[] res = new int[set.size()];
        int index = 0;
        for(int num : set)
            res[index++] = num;
        return res;//耗时1ms,空间42.07
    }
}

快乐数

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

「快乐数」 定义为:

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

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

思路:题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现!!所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while(!set.contains(n)){
            if(n == 1)return true;
            set.add(n);
            n = getSum(n);
        }
        return false;
    }
    public int getSum(int n){
        int num;
        int sum = 0;
        while(n != 0){
            num = n % 10;
            sum += num * num;
            n /= 10;
        }
        return sum;
    }
}

两数之和

题目链接:1. 两数之和

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

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

你可以按任意顺序返回答案。

 思路:本题我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,所以我们需要定义一个map来解决

key:用来存放遍历的元素

value:用来存放遍历元素的下标

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            //如果map中存在遍历元素所需要的“搭档”,就直接返回对应下标即可
            if(map.containsKey(target - nums[i]))return new int[]{map.get(target - nums[i]),i};
            map.put(nums[i],i);
        }
        return null;
    }
}

标签:set,return,int,异位,day05,num,数组,new,两数
From: https://blog.csdn.net/2301_76909842/article/details/139637475

相关文章

  • 代码随想录第6天 | ●哈希表理论基础●242.有效的字母异位词●349. 两个数组的交集●2
    题目:242.有效的字母异位词思路:1.ASCII和哈希函数,存入数组,比较数组相等否2.首先选择数据结构,题目只有小写字母,ASCII连续,选用数组,一个字符串遍历,在哈希数组中存入字母出现频率,第二个字符串遍历,做减法。(不需要记ASCII,直接减字母,编译器自己算)时间复杂度:O(n)空间复杂度:O(1)坑......
  • 代码随想录 算法训练营 d6 哈希表 Leetcode242 有效的字母异位词 Leetcode349 两个数
    哈希表很重要哈希表哈希表场景一般哈希表都是用来快速判断一个元素是否出现集合里一般来说数组模拟哈希set 哈希map不同的场景 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,se......
  • Q25 LeetCode49 字母异位词分组
    难好好看看  1classSolution{2publicList<List<String>>groupAnagrams(String[]strs){3if(strs==null||strs.length==0)4returnnewArrayList<>();5//map中key存储的是字符串中字母排序后新的字符串6Map<Stri......
  • Q23 LeetCode242 字母异位词
    1.先进行简单的字符长度判断,不相等直接返回false;2.containsKey()的使用3.在减减循环14-17行里判别key的value是否为0,要不然会报错 1classSolution{2publicbooleanisAnagram(Strings,Stringt){3if(s.length()!=t.length()){4return......
  • LeetCode第一题“两数之和”(梦开始的地方~)
    “有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。”“两年前第一次刷leetcode,第一题就不会。两年后的今天重刷第一题还是不会,我还是以前的我,不忘初心,没有一丝丝改变。”逛力扣的时候发现的,挺好玩的······然后看看LeetCode第一题难在哪里吧!题目:给定一个......
  • 代码随想录算法训练营第五天 | 哈希表基础、有效字母异位、两个数组交集、快乐数
    哈希表基础理论https://programmercarl.com/哈希表理论基础.html#哈希表242有效字母异位词题https://leetcode.cn/problems/valid-anagram/description/242代码随想录解析https://programmercarl.com/0242.有效的字母异位词.html#算法公开课349两个数组的交集https://leetc......
  • 49. 字母异位词分组
    题目给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["nat","tan"],[&qu......
  • 力扣 1题 两数之和(哈希) 记录
    题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=......
  • 深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
    在本篇文章中,我们将详细解读力扣第170题“两数之和III-数据结构设计”。通过学习本篇文章,读者将掌握如何设计一个数据结构来支持两种操作,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解,以便于理解。问题描述力扣第170题“两数之和III......
  • Day 6| 242.有效的字母异位词 、349. 两个数组的交集 、 202. 快乐数 、 1. 两数之和
    242.有效的字母异位词建议:这道题目,大家可以感受到数组用来做哈希表给我们带来的遍历之处。题目链接/文章讲解/视频讲解:https://programmercarl.com/0242.有效的字母异位词.html思考很简单的一道题,需要记住python获取ascii值的函数时ord()classSolution:defisAnag......