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

系列文章目录


目录

  • 系列文章目录
  • 242.有效的字母异位词
  • 349. 两个数组的交集
    • ①使用HashSet
    • ②使用Hash数组
  • 202. 快乐数
  • 1. 两数之和
    • ①暴力解法(时间复杂度不符合要求)
    • ②使用HashMap法


242.有效的字母异位词

这道题是数组在哈希表中的典型应用。

因为只有26个小写字母,且这26个元素是连续的,所以采用数组这种数据结构。将字符串的字母减去字母a得到的就是从02526个字母的下标索引。数组的值就是元素出现的次数,也就是遍历到这个元素,对应的数组值就++。这样就记录了第一个字符串中每个元素出现的次数。再遍历第二个字符串,让数组值--,最后判断数组值是否全为0即可。

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];
        for (int i = 0; i < s.length(); i++) {
            record[s.charAt(i) - 'a']++;// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
        }
        for (int i = 0; i < t.length(); i++) {
            record[t.charAt(i) - 'a']--;
        }
        for (Integer i : record) {
            if(i!=0){// record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        return true; // record数组所有元素都为零0,说明字符串s和t是字母异位词
    }
}

349. 两个数组的交集

①使用HashSet

将第一个数组放到Set中,然后看第二个数组的值有没有在里面出现,出现的话就记录。

剪枝:在已知不符合条件的情况下,剪枝避免做无效判断。因为遍历本质是在决策,决策是为了求得结果,已知结果的决策就没有必要进行了。

        //判断条件
        if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){
            return new int[0];
        }
import java.util.HashSet;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        //判断条件
        if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){
            return new int[0];
        }

        HashSet<Integer> set1 = new HashSet<>();
        HashSet<Integer> set2 = new HashSet<>();
        //遍历数组1
/*        for (int i = 0; i < nums1.length; i++) {
            set1.add(nums1[i]);
        }*/
        for (int i : nums1) {
            set1.add(i);
        }
        //遍历数组2的过程中判断哈希表中是否存在该元素
        // ①如果加不进去,则说明该元素在第一个数组中存在
        // ②直接使用contains方法来查看集合中是否有该元素
/*        for (int i = 0; i < nums2.length; i++) {
            if (!set1.add(nums2[i])) {//①如果加不进去,则说明该元素在第一个数组中出现过
                set2.add(nums2[i]);
            }*/
        for (int i : nums2) {
            if (set1.contains(i)) {//②直接使用contains方法来查看集合中是否有该元素
                set2.add(i);
            }
        }
/*        //方法1:将结果集合转为数组
        return set2.stream().mapToInt(x -> x).toArray();*/

        //方法2:另外申请一个数组存放setRes中的元素,最后返回数组
        int[] arr = new int[set2.size()];
        int i = 0;
        for (Integer setnum : set2) {
            arr[i++] = setnum;
        }
        return arr;
    }
}

在这里插入图片描述
Set 的常用方法:add:添加单个元素;size:获取元素个数。contains:查找元素是否存在;也可再次加入元素看能否加进去来判断元素是否存在。需要注意的是,SettoArray的方法,该方法是重写接口Collection的方法。可返回包含此集合中所有元素的数组。
在这里插入图片描述

但是转换成数组的元素类型是object,所以还是建议重新创建一个数组来存放Set集合中的值。

//方法1:将结果集合转为数组
        return set2.stream().mapToInt(x -> x).toArray();
//方法2:另外申请一个数组存放setRes中的元素,最后返回数组
        int[] arr = new int[set2.size()];
        int i = 0;
        for (Integer setnum : set2) {
            arr[i++] = setnum;
        }
        return arr;

②使用Hash数组

class Solution {                                                                             
    public int[] intersection(int[] nums1, int[] nums2) {                                    
        int[] hash1 = new int[1003];                                                         
        int[] hash2 = new int[1003];                                                         
        //nums1中出现的字母在hash1数组中做记录                                                            
        for (int i = 0; i < nums1.length; i++) {                                             
            hash1[nums1[i]]++;                                                               
        }                                                                                    
        //nums2中出现的字母在hash2数组中做记录                                                            
        for (int i = 0; i < nums2.length; i++) {                                             
            hash2[nums2[i]]++;                                                               
        }                                                                                    
        //创建一个实现List集合的实现类来存相同元素,                                                            
        // ArrayList效率比Vector高,改查效率比LinkedList高                                              
        ArrayList<Integer> resList = new ArrayList<>();                                      
        for (int i = 0; i < hash1.length; i++) {                                             
            if (hash1[i] > 0 && hash2[i] > 0) {//如果相同下标位置值都大于0,说明元素有交集                       
                resList.add(i);                                                              
            }                                                                                
        }                                                                                    
		//方法1:将结果集合转为数组                                      
		//return resList.stream().mapToInt(x -> x).toArray();
		                                                     
		//方法2:另外申请一个数组存放setRes中的元素,最后返回数组                    
		int[] arr = new int[resList.size()];                 
		int index = 0;                                       
		for (Integer i : resList) {                          
		    arr[index++] = i;                                
		}                                                    
		return arr;                                                                                                                
    }                                                                                        

在这里插入图片描述
toArray方法是重写接口Collection的方法,故ArrayList也能调用toArray方法。

//方法1:将结果集合转为数组                                      
		return resList.stream().mapToInt(x -> x).toArray();
//方法2:另外申请一个数组存放setRes中的元素,最后返回数组                    
		int[] arr = new int[resList.size()];                 
		int index = 0;                                       
		for (Integer i : resList) {                          
		    arr[index++] = i;                                
		}                                                    
		return arr;

202. 快乐数

①当不知道一个数是几位数时,求各个位上的平方和的方法要记住。就取这个数的个位(模,即%10),然后将这个数/10,再求个位,while循环,判断的条件是这个数>0

        int sum = 0;
        while (n > 0) {
            int temp = n % 10;//得到末位数
            sum += temp * temp;
            n = n / 10;//缩小一位
        }

②主方法isHappy中退出循环需要两个条件①n1。②集合中已有该元素。故最后在返回值时需return n == 1;来判断当退出循环时是否是满足第①条件退出的。

class Solution {
    public boolean isHappy(int n) {

        HashSet<Integer> set = new HashSet<>();
 /*       while (n != 1) {
            if (!(set.add(n))) {//加过集合的元素再加就为false
                return false;
            }
            n = getNextNumber(n);
        }
        return true;*/

        //退出该循环有两个条件:①n为1②集合中已有该元素
        while (n != 1 && !set.contains(n)) {
            set.add(n);
            n = getNextNumber(n);
        }
        return n == 1;
    }

    private int getNextNumber(int n) {
        int sum = 0;
        while (n > 0) {
            int temp = n % 10;//得到末位数
            sum += temp * temp;
            n = n / 10;//缩小一位
        }
        return sum;
    }
}

1. 两数之和

①暴力解法(时间复杂度不符合要求)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //暴力解法
        for (int i = 0; i < nums.length; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if(nums[i]==target-nums[j]){
                    return new int[]{i,j};
                }
            }
        }
        return new int[0];
    }
}

在这里插入图片描述

②使用HashMap法

Mapkey值有没有出现过的判断方法:containsKey()
剪枝(自己没写),若数组为null或者长度为0则直接返回退出:

        //剪枝(自己没写)
        if (nums == null || nums.length == 0) {
            return res;
        }
import java.util.HashMap;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] twoSum(int[] nums, int target) {
        //使用HashMap法
        int[] res = new int[2];//只创建一个数组(自己创建了两个数组)
        //剪枝(自己没写)
        if (nums == null || nums.length == 0) {
            return res;
        }
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];// 遍历当前元素,并在map中寻找是否有匹配的key
            if (map.containsKey(temp)) {
                //return new int[]{i, map.get(temp)};
                res[0] = i;
                res[1] = map.get(temp);
                return res;
            }
            map.put(nums[i], i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中
        }
        //return new int[0];
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/453146.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】STL(七) set容器

8. set容器8.1 简介8.2 构造和赋值例子 8.3 大小和交换例子 8.4 插入和删除例子 8.5 查找和统计例子 8.6 set和multiset区别例子 8.7 pair对组创建 ----- 成对出现的数据&#xff0c;利用对组可以返回两个数据创建方式例子 8.8 内置类型指定排序规则&#xff08;1&#xff09; …

Powershell应用

Powershell应用 帮助命令进程管理服务管理文件管理网络管理系统管理用户管理远程管理常见问题 字符串和文本处理脚本和模块其他常用命令返回值类型PowerShell调用C# 类库PowerShell使用WmiWQL测试工具 帮助命令 Get-Help 这个命令用于获取其他命令的帮助文档&#xff0c;例如 …

像SpringBoot一样使用Flask - 3.蓝图路由Blueprint

接上一篇文章《像SpringBoot一样使用Flask - 2.静态资源访问及模版》&#xff0c;我们看到测试的"controller"都写在了一起&#x1f914; 如何像Springboot一样划分出一个完整的controller&#xff0c;里面实现不同业务的包呢&#xff1f; 本篇引入Blueprint&#xf…

Qt教程 — 1.1 Linux下安装Qt

目录 1 下载Qt 1.1 官方下载 1.2 百度网盘下载 1.3 Linux虚拟机终端下载 2 Qt安装 3 安装相关依赖 4 测试安装 1 下载Qt 1.1 官方下载 通过官网下载对应版本&#xff0c;本文选择的版本为qt-opensource-linux-x64-5.12.12&#xff0c;Qt官方下载链接&#xff1a;htt…

Liunx文件系统和基础IO

文件系统和基础IO 基础IOc语言基础IO函数当前路径和标准流系统IO系统调用函数重定向FILE文件结构体 在谈缓存区问题理解文件系统初识inode 基础IO c语言基础IO函数 打开与关闭 FILE *fopen(char *filename, const char *mode);选项还可以是 r/w/a 意味着为可读可写打开。 2…

【CSS】 css 实现文字的渐变色

效果 实现 .text {position: absolute;left: 52px;top: 1px;width: 200px;height: 31px;font-family: YouSheBiaoTiHei;font-size: 24px;color: rgba(255, 255, 255, 0.8);line-height: 31px;text-shadow: 0px 0px 8px #000000;text-align: center;font-style: normal;transiti…

车载气象站比传统气象站的优势是什么

【TH-CZ5】车载气象站在灵活性、覆盖范围、实时监测、多功能性和成本效益等方面均优于传统气象站。这些优势使得车载气象站在气象监测、气象服务、灾害应急等领域具有广泛的应用前景。 车载气象站与传统气象站相比&#xff0c;具有显著的优势&#xff0c;主要体现在以下几个方…

内网渗透-跨域环境渗透-2

目录 内网渗透-跨域环境渗透-2 热土豆提权 Wimc连接执行命令 Responder 密码抓取 WPAD提权 提取域控的NTDS hash文件 内网渗透-跨域环境渗透-2 热土豆提权 这个是提升本地权限的&#xff0c;不是提域控&#xff01; 总结&#xff1a;Potato.exe -ip 需要提权的IP -disab…

Java+SpringBoot+Vue+MySQL:教育培训办公系统的全栈开发

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

系统设计学习(二)用户认证场景

一、常用鉴权方式 HTTP Basic Authentication (HTTP基本认证) session-cookie 1&#xff0c;服务器在接受客户端首次访问时在服务器端创建session&#xff0c;然后保存session(我们可以将session保存在内存中&#xff0c;也可以保存在redis中&#xff0c;推荐使用后者)&…

Idea 看不到本地 change

环境 idea IntelliJ IDEA 2023.3.3 (Community Edition) idea 升级后&#xff0c;看不到本地change了&#xff0c;去掉下面勾选即可。 解决&#xff1a;

python调用clickhouse

&#xff08;作者&#xff1a;陈玓玏&#xff09; 使用clickhouse-driver包&#xff0c;先通过pip install clickhouse-driver安装包&#xff0c;再通过以下代码执行sql。 from clickhouse_driver import Client client Client(host10.43.234.214, port9000, userclickhou…

【网络安全】手机不幸被远程监控,该如何破解,如何预防?

手机如果不幸被远程监控了&#xff0c;用三招就可以轻松破解&#xff0c;再用三招可以防范于未然。 三招可破解可解除手机被远程监控 1、恢复出厂设置 这一招是手机解决软件故障和系统故障的终极大招。只要点了恢复出厂设置&#xff0c;你手机里后装的各种APP全部将灰飞烟灭…

AMEYA360:稳先微汽车驱动芯片—智能高边开关WS7系列

近几年&#xff0c;新能源汽车高速发展&#xff0c;用车浪潮蔓延全球&#xff0c;我国新能源汽车占有量连续9年居全球前列&#xff0c;2023年全年市占率达37.7%&#xff0c;市场规模可观&#xff0c;并显现出以下特点&#xff1a;电车产品对比油车优势明显、消费者接受度高、市…

蓝桥杯算法错题记录-基础篇

文章目录 本文还在跟新&#xff0c;最新跟新时间3/11&#xff01;&#xff01;&#xff01; 格式一定要符合要求&#xff0c;&#xff08;输入&#xff0c;输出格式&#xff09;1. nextInt () next() nextLine() 的注意事项2 .数的幂 a^2等3.得到最大长度&#xff08;最大...&a…

【python pyinstaller库】pyinstaller介绍、安装、以及相关重点知识

PyInstaller是一个在Windows、GNU/Linux、macOS等平台下将Python程序冻结&#xff08;打包&#xff09;为独立可执行文件的工具, 用于在未安装Python的平台上执行Python编写的应用程序。 相比类似工具&#xff0c;它的主要优点是 PyInstaller 与 Python 3.7-3.10 一起工作&…

阿里又又发布了一个“AI神器”

阿里给“打工”朋友送上“节日礼物” 六一儿童节当天&#xff0c;阿里就给所有“打工”的大朋友送上了一份“节日礼物” 6月1日上午&#xff0c;阿里云发布了面向音视频内容的AI新品“通义听悟”&#xff0c;并正式公测 通义千问、通义听悟 这哥俩现在所处环境不同&#xff0…

Druid连接池经常性断链问题

前段时间有应用使用Druid连接池经常的提示断链报错&#xff0c;整个问题排查分析过程很有意思。这里将Druid连接池、数据库层以及负载均衡层的配置分析下&#xff0c;记录整个问题的分析过程&#xff0c;同时梳理下Druid连接池的配置和连接保活及回收机制。 1、问题背景 应用…

线程(thread)

目录 线程的基本特性 pthread库的主要函数 pthread_create pthread_join pthread_exit pthread_mutex_init pthread_mutex_lock 和 pthread_mutex_unlock pthread_cond_init pthread_cond_wait 和 pthread_cond_signal / pthread_cond_broadcast pthread_cond_destro…

探索Linux世界:基本指令(文件查看、时间相关、grep、打包压缩及相关知识)

今天继续介绍一些指令 文章目录 1.cat - 查看文件1.1输出重定向和追加重定向1.2指令echo 2.more 指令3.less - 逐页查看文本文件内容4.head- 显示文件开头部分内容5.tail - 显示文件末尾部分内容5.1输入重定向&#xff08;<&#xff09;5.2管道&#xff08;|&#xff09; 6.…