首页 > 编程语言 >代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、202. 快乐数、1. 两数之和

代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、202. 快乐数、1. 两数之和

时间:2023-05-29 23:01:30浏览次数:52  
标签:202 return nums int res 随想录 Set new 两数

242.有效的字母异位词

力扣题目链接(opens new window)

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

示例 1: 输入: s = "anagram", t = "nagaram" 输出: true

示例 2: 输入: s = "rat", t = "car" 输出: false

说明: 你可以假设字符串只包含小写字母。

思路:

哈希表的方式,用key-value的方式来保存字符串中字母出现的个数。这里的一个难点就是如何选择字母key的表现形式。Java中存在一个方法就是charAt()方法,返回指定索引处的字符。而s.charAt(index) - ‘a’ 会返回一个数字,用数字代表字母key会方便很多。

为了判断是否为字母异位词,只需要将s字符串的字母出现次数保存在recode数组中,再将t字符串的字母出现次数减去即可。

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];     //字符串一定是26个字母的
        for(int i = 0; i < s.length(); i++){
            record[s.charAt(i) - 'a']++;      //将s中出现的字母次数保存到record表中
        }
        for(int j = 0; j < t.length(); j++){
            record[t.charAt(j) - 'a']--;
        }

        for(int count : record){
            if(count != 0){
                return false;
            }
        }
        return true;
    }
}

349. 两个数组的交集

力扣题目链接(opens new window)

题意:给定两个数组,编写一个函数来计算它们的交集。

代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、202. 快乐数、1. 两数之和_字符串

说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。

思路:

一想到不重复元素且无序,首先想到的是Set集合,关于Java中Set集合的种种操作,要熟记于心。

题目要求最终返回数组,需要将求到的集合再转成数组。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1 == null || nums2 == null) return new int[0];
        //交集即为不重复无序元素,考虑用Set集合
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();   
        for(int i : nums1){
            set1.add(i);
        }
        for(int j : nums2){
            if(set1.contains(j)){
                set2.add(j);     //set2中保存着交集元素
            }
        }

        int[] arr = new int[set2.size()];    //将集合里的元素放到数组里去
        int j = 0;
        for(int i : set2){
            arr[j++] = i;
        }
        return arr;
    }
}

第202题. 快乐数

力扣题目链接(opens new window)

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

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

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

思路:

第一个难点,题目说是无限循环,意味着这个n会重复出现,判断一个元素有没有重复,需要用到Set集合

第二个难点,取数值各个位上的单数操作,要牢记。

class Solution {
    public boolean isHappy(int n) {
        //需要观察这个数是否一直在循环重复,需要用到Set集合
        Set<Integer> set = new HashSet<>();
        while(n != 1 && !set.contains(n)){
            set.add(n);
            n = getNext(n);
        }

        return n == 1;
    }

    private int getNext(int n){
        int res = 0;
        while(n > 0){     
            int tmp = n % 10;     //最后面一位
            res += tmp * tmp;
            n /= 10;
        }
        return res;
    }
}

1. 两数之和

力扣题目链接(opens new window)

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思路:

1、为什么用哈希表

当想到要一个元素是否出现过,或者是否在一个集合中,就要想到用哈希表。

2、为什么用map

需要想到这个元素是否出现过,还得知道元素下标。用map中的key-value结构来保存,key保存元素,value保存元素下标。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if(nums == null) return res;

        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            int tmp = target - nums[i];
            if(map.containsKey(tmp)){
                res[0] = i;
                res[1] = map.get(tmp);
                break;
            }
            map.put(nums[i],i);
        }
        return res;
    }
}

标签:202,return,nums,int,res,随想录,Set,new,两数
From: https://blog.51cto.com/u_15505301/6374619

相关文章

  • 【专题】2022中国新能源汽车发展趋势白皮书报告PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=31861新能源汽车市场从政策推动到市场驱动的转变过程中,行业也在经过了一个萌芽期和初期的探索期之后,步入了一个迅速发展的时期。此外,在科技力量的加持下,品牌、车型、区域等细分领域都在持续地进行着调整,行业格局已经初具规模,在持续的创新中,产业已经......
  • 2023年5月29号
    河北宏志大学学生成绩管理系统1、项目需求:学生管理是各大院校的管理工作中尤为重视的一项工作,它一直以来是学校管理的一项重要的衡量指标。学生管理系统的应用解决了学校日常学生管理工作中的信息量大、数据难以统计、数据更新困难等问题。河北宏志大学为了提高工作效率,及时掌握......
  • 2023-05-29:给你一个由 n 个正整数组成的数组 nums 你可以对数组的任意元素执行任意次
    七、设计算法,仅使用三次实数乘法即可完成复数a+bi和c+di相乘。算法需接收a、b、c和d为输入,分别生成实部ac-bd和虚部ad+bc。文心一言:可以使用如下算法来计算复数a+bi和c+di的积,且只需进行三次实数乘法:1.将a和b相乘,得到ab;2.将c和d相乘,得到cd;3.将ab+cd赋......
  • 2023.5.29每日总结
    publicAllMethods()throwsException{Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/rjgc?useSSL=false&useUnicode=true&characterEncoding=utf8";Stringusername="......
  • CodeStar2023年春第9周周赛普及进阶组
    T1:奇怪的银行可以直接把\(1,6^p,9^p\)当做物品大小,跑一遍完全背包。时间复杂度为\(\mathcal{O}(n\logn)\)记dp[i][j]表示前\(i\)种面值恰好凑出\(j\)元的最少张数转移:\[dp[i][j]=\min(dp[i-1][j],dp[i][j-w_i]+1)\]代码实现#include<bits/stdc++.h>#defin......
  • 【2023 · CANN训练营第一季】——Ascend C算子背后的魔法
    前言:TIKC++,2023年CANN的一个神奇魔法,得益于TIKC++算子的孪生调试技术,我们可以了解到更多的技术细节,本文试图对隐藏在多核并行,流水计算、dobulebuffer背后的CANNAscendC算子魔法进行摸索和理解,是什么样的技术让用户编写的简单代码可以先实现上述神奇的功能。本文没有请专业人士......
  • 2021级《软件工程》 开发技能测试试卷题目-河北宏志大学学生成绩管理系统
    2021级《软件工程》开发技能测试试卷(180分钟)河北宏志大学学生成绩管理系统(卷面成绩40分)河北宏志大学学生成绩管理系统1、项目需求:学生管理是各大院校的管理工作中尤为重视的一项工作,它一直以来是学校管理的一项重要的衡量指标。学生管理系统的应用解决了学校日常学生管理工......
  • 2023年一级建造师考试教材最新版电子教程
    2023年一级建造师考试教材已正式发布,教材相对于去年有不小的改动,一级建造师考试教材频道为您整理2023年一级建造师教材汇总,希望能够帮助到大家!包含:2023国家一级建造师【公路实务】电子版教材PDF2023国家一级建造师【工程经济】电子版教材PDF2023国家一级建造师【水利实务】电子版教......
  • 基于QT的空闲教室预约系统[2023-05-29]
    基于QT的空闲教室预约系统[2023-05-29][课程设计选题十]空闲教室预约系统课程设计内容利用QtCreater等工具和Linux环境下时间日期API实现一个基于图形界面的空闲教室预约系统,自行构建界面,可以实现选择日期、教学楼、教室座位数,查询相应空闲教室情况,录用申请信息,教室管理员......
  • 2023ciscn-misc-国粹复现
    说明:此题给出的两个图片,a.png及k.png是分别表示的x坐标和y坐标。然后再用此坐标对题目进行画图,从而得出flag但是由于本人的代码技术有限只能借鉴大佬们的代码然后对其进行分析学习。importnumpyasnpfromPILimportImage classtest():   def__init__(self):......