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

news2025/4/6 13:27:20

JAVA代码编写

242. 有效的字母异位词

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

教程:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

视频:https://www.bilibili.com/video/BV1YG411p7BA

方法一:

思路:题目中给出字符串都是小写字母a-z,这样就有26个下标,通过字母与‘a’相减,获取下标值,在一个字符串中进行++操作,在另一个字符串中进行–操作,当结果数组中有一个不为0的数,就返回false,否则返回true。很是巧妙。

复杂度分析

  • 时间复杂度: O(m+n)

  • 空间复杂度: O(1)

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']++;
        }
        for(int i=0;i<t.length();i++){
            record[t.charAt(i)-'a']--;
        }
        for(int count:record){
            if(count!=0){
                return false;
            }
        }
        return true;
    }
}

349. 两个数组的交集

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

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

教程:https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html

视频:https://www.bilibili.com/video/BV1ba411S7wu

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

方法一:

思路:考虑到即使交集是重复的,所以采用Set数据结构,set不包含重复数据,没有顺序。

遍历数组nums1,依次将值存入set1中,实现了去重。然后再遍历数组nums2的时候,查看set1是否包含该值,有的话添加到新的set,最后将set类型转为数组类型返回。

复杂度分析

  • 时间复杂度: O(logn)

  • 空间复杂度: O(n)

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1= new HashSet<>();
        Set<Integer> resSet= new HashSet<>();
        for(int i =0;i<nums1.length;i++){
            set1.add(nums1[i]);
        }
        
        //遍历数组2的过程中判断哈希表中是否存在该元素
        for (int i : nums2) {
            if (set1.contains(i)) {
                resSet.add(i);
            }
        }

        int[] arr = new int[resSet.size()];
        int j = 0;
        for(int i : resSet){
            arr[j++] = i;
        }
        
        return arr;

    }
}

202. 快乐数

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

「快乐数」 定义为:

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

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

示例 1:

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

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

教程:https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html

方法一:

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

一开始疑惑为什么要判断是否出现相同的和,好像可以这么理解,因为你有重复的话,就是死循环,不会有结果是1的情况。

复杂度分析

  • 时间复杂度: O(1)

  • 空间复杂度: O(1)

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

    private int getNextNumber(int n) {
        int res = 0;
        while (n > 0) {
            int temp = n % 10;
            res += temp * temp;
            n = n / 10;
        }
        return res;
    }
}

为找工作,我的代码都是用的JAVA,慢慢学习中。

LeetCode刷题Day1

1.两数之和

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

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

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

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

**进阶:**你可以想出一个时间复杂度小于 O(n2) 的算法吗?

解题方法

1.暴力求解

  • 枚举在数组中所有的不同的两个下标的组合
  • 逐个检查它们所对应的数的和是否等于target

复杂度分析
时间复杂度: O ( n 2 ) O(n^2) O(n2),这里n为数组的长度。

空间复杂度: O ( 1 ) O(1) O(1),只用到常数个临时变量。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        
        for(int i=0;i<len-1;i++){
            for(int j=i+1;j<len;j++){
                if(nums[i]+nums[j]==target){
                    return new int[]{i,j};
                }
            }
        }
        throw new IllegalArgumentException("No two sum solution");//不写不能通过
    }
    public static void main(String[ ] args){
        int[] arrayName = {2,7,11,15};
        Solution s = new Solution();
        int[] indexs=s.twoSum(arrayName,9);
        for (int i = 0; i < indexs.length; i++) {
            System.out.print(indexs[i]+" ");
        }
    }
}

我自己想到的也是这个暴力破解,因为其他不熟练,但是第一个for循环,我原本写的是(i<len),听了官方视频讲解,说是,每种输入只会对应一个答案,所以和内循环区分一下。
这里要说下,java中数组的定义

  1. new int[]{1,2,3}
  2. int[] nums = new int[5];
    nums[0]=1;
  3. int[] nums = Array.create(1, 2, 3, 4, 5);//使用Array类的静态方法创建和初始化数组:
  4. int[] source = {1, 2, 3, 4, 5};//使用Arrays类的静态方法复制、排序等操作数组:
    int[] target = Arrays.copyOf(source, source.length); // 复制数组
    Arrays.sort(target); // 对目标数组进行排序

对于代码中抛出的异常,要加上这句,是因为,如果数组nums中不存在符合条件的两个数,就不会有返回值,而函数定义的时候,定义的返回类型是int[],会报错,所以需要抛出异常。
再看看这个异常IllegalArgumentException非法参数异常,当传递给方法的参数不满足预期时,比如传入了无效的参数或空值,容易引发此异常,如果找不到符合条件的两个数,就抛出这个非法参数异常,错误信息是“No two sum solution”。

2.查找表法

  • 在遍历的同时,记录一些信息,以省去一层循环,这是“以空间换时间"的想法

  • 需要记录已经遍历过的数值和它所对应的下标,可以借助查找表实现

  • 查找表有两个常用的实现:

    • 哈希表

    • 平衡二叉搜索树

复杂度分析

  • 时间复杂度:O(n),这里n为数组的长度。
  • 空间复杂度:O(n),哈希表里最多需要存n-1个键值对。
class Solution1 {
    public int[] twoSum(int[] nums, int target){
        int len = nums.length;
        Map<Integer,Integer> hashMap = new HashMap<>(len-1);
        hashMap.put(nums[0], 0);//这一行也可以不加,因为下面的for循环也会加入的
        for (int i = 0; i < len; i++) {
            int another = target-nums[i];
            if (hashMap.containsKey(another)){
                return new int[]{i,hashMap.get(another)};
            }
            hashMap.put(nums[i],i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}

在这里插入图片描述图片来自leetcode官网

思路:定义一个Map存放键值对,默认将nums[0]添加进去(Map这里用put添加元素),官方给出的代码这边初始化了一下,但在for循环中,nums[0]又被加了一下。

    public static void main(String[] args) {
        Map<Integer,Integer> hashMap = new HashMap<>(5);
        hashMap.put(0,1);
        hashMap.put(0,1);
        for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }//Key: 0, Value: 1
    }

我不太了解这个结构,就敲代码试了一下,同样的值加两次,Map他实际第2次会覆盖第1次,应当是按键来存值的,一个键只能一个值。
这里给hashMap赋初值,大概是出于一个程序员的谨慎,就和写文件动不动就ctrl+S一样,hhh。

接着开始遍历,对于nums[0]也就是6,他需要找到一个值为2的,当前Map中没有2,没有就将他存入Map中;对于nums[1]也就是3,他需要找到一个值为5的,当前Map中没有5,没有就将他存入Map中;对于nums[2]也就是8,他需要找到一个值为0的,当前Map中没有0,没有就将他存入Map中;对于nums[3]也就是2,他需要找到一个值为6的,当前Map中有6,找到了,因为题目中说每种输入只会对应一个答案,找到了就返回new int[]{i,hashMap.get(another)}

再思考一下为什么要将数组的下标和值,将值变为map中的键,下标变为map中的值,大概是因为这样好操作,可以根据值得到我们要的下标。脑子不够用,需要理一下思路。

如有错误,请指正!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch复现4_Resnet

ResNet在《Deep Residual Learning for Image Recognition》论文中提出&#xff0c;是在CVPR 2016发表的一种影响深远的网络模型&#xff0c;由何凯明大神团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。Image…

为什么需要企业云性能监控?

云计算已经成为企业信息技术的核心组成部分&#xff0c;提供了灵活性、可扩展性和成本效益。然而&#xff0c;随着企业的应用程序和数据迁移到云中&#xff0c;监控和管理云性能变得至关重要。在这篇文章中&#xff0c;我们将探讨企业云性能监控的重要性是什么! 为什么需要企业…

瞄准一款好用到爆的在线数据库设计工具Itbuilder,被惊艳了!

在线数据库设计工具都不陌生&#xff0c;这与日常开发工作息息相关&#xff0c;每天都会用到。一款好用的在线数据库设计工具可以帮我们省去很多事情&#xff0c;Itbuilder在线数据库设计工具简单工作台&#xff0c;有利于新手操作&#xff0c;丰富的功能&#xff0c;可以满足开…

RHCSA -- VMware虚拟机配置及破解密码

一、配置虚拟机 1、开启VMware&#xff08;自定义&#xff09; 2、设置虚拟机硬件兼容性&#xff08;默认&#xff09; 3、稍后安装虚拟机操作系统 4、选择为Linux的虚拟机 5、虚拟机机名 6、设置虚拟机处理器 7、设置虚拟机所连接的网络类型 8、选择磁盘类型 9、设置所选磁…

【Liunx应用市场】yum

【Liunx应用市场】yum 1. Linux 软件包管理器 yum2. yum源3. yum的使用3.1 yum查找3.2 yum安装3.3 yum删除 所属专栏&#xff1a;Linux学习❤️ &#x1f680; >博主首页&#xff1a;初阳785❤️ &#x1f680; >代码托管&#xff1a;chuyang785❤️ &#x1f680; >感…

【Qt控件之QInputDialog】详解

Qt控件之QInputDialog 概述常用函数枚举成员方法信号 示例使用场景问题&#xff1a;使用QInputDialog是否可以使用正则表达式验证示例 概述 QInputDialog类提供了一个简单方便的对话框&#xff0c;用于从用户获取单个值。 输入值可以是字符串、数字或列表中的项。必须设置一个…

X64指令基本格式

X64指令基本格式 1 REX Prefix结构2 REX prefix扩展位2.1 第一种&#xff0c;无SIB字节的内存寻址&#xff08;mod !11 &#xff09;2.2 第二种&#xff0c;寄存器到寄存器的寻址&#xff08;无内存操作数&#xff0c;mod11&#xff09;2.3 第三种&#xff0c;带SIB字节的内存寻…

JVM虚拟机:JVM的垃圾回收清除算法(GC)有哪些

垃圾回收清除算法 引用计数法 标记清除 拷贝算法 标记压缩 引用计数法 有一个引用指向对象,那么引用计数就加1,少一个引用指向,那么引用计数就减1,这种方法了解一下就好,JVM机会不会使用这种方法,因为它在每次对象赋值的时候都要维护引用计数器,且计数器本身也有一定的…

智能座舱中的人工智能数据

智能汽车——推动变革与盈利的利刃 对于汽车公司而言&#xff0c;投资于人工智能解决方案从未显得如此关键。据 Tractica 预测&#xff0c;到 2025 年&#xff0c;汽车 AI 硬件、软件和服务的市场规模将从 2017 年的 12 亿美元上升至 265 亿美元。该行业具有巨大的变革潜力&am…

高等数学啃书汇总重难点(十一)曲线积分与曲面积分

依旧是公式极其复杂恶心的一章&#xff0c;建议是&#xff1a;掌握两种线面积分的计算套路即可&#xff0c;和第8章一样属于同济版教材中最不重要的章节&#xff0c;不会对底层理解做过多考察~ 1.弧长曲线积分的几何意义 2.弧长曲线积分的定义和性质 3.弧长曲线积分的计算方式 …

GitHub项目监控

目录 github开放平台接口限流 监控某个仓库的更新状态 对于常用Github的用户来说&#xff0c;经常有一些自动化的需求。比如监控某些项目的更新情况并实时拉取&#xff0c;比如监控github全网上传的代码是否携带了公司的APIKEY&#xff0c;SECRETKEY等… github开放平台 gith…

【代码数据】2023粤港澳大湾区金融数学建模B题分享

基于中国特色估值体系的股票模型分析和投资策略 首先非常建议大家仔细的阅读这个题的题目介绍&#xff0c;还有附赠的就是那个附件里的那几篇材料&#xff0c;我觉得你把这些内容读透理解了&#xff0c;就可以完成大部分内容。然后对于题目里它主要第一部分给出了常用的估值模…

阿里云无影升级2.0 云电脑解决方案时代到来

10月31日&#xff0c;杭州云栖大会上&#xff0c;阿里云宣布无影全新升级2.0&#xff1a;从云电脑到云上解决方案&#xff0c;帮助中小企业更便捷地构建云上办公&#xff0c;并开放无影产品及解决方案能力&#xff0c;为生态合作伙伴提供企业云平台&#xff0c;帮助其打造定制化…

四川达州-全国先进计算创新大赛总结

目录 四川达州-全国先进计算创新大赛 1.三个算法&#xff0c;第三个原创的&#xff1f;&#xff08;国内对比&#xff09; 2.方案的实际落地应用&#xff1f;&#xff08;落地应用&#xff09; 3.农业数据采集有问题&#xff08;数据采集汇总&#xff09;&#xff0c;很难…

【JS】this指向

一、this指向的四种规则 1.默认绑定规则 对象指向&#xff0c;比较的是引用地址。 console.log(this window); //true console.log({} {}); //false //函数的独立调用 function test(){console.log(this window); //true } test(); 2.隐式绑定规则 谁调用…

从中序和后序遍历序列构造二叉树

注意&#xff1a;该解法是基于二叉树中的值不存在重复所写的。 代码如下&#xff0c;可开袋即食 class Solution {private Map<Integer,Integer> map;public TreeNode buildTree(int[] inorder, int[] postorder) {map new HashMap<>();for(int i 0; i < in…

Mysql数据库 6.SQL语言 分组、分页查询

分组查询—group by 分组——就是将数据表中的记录按照指定的类进行分组 关键字——group by 语法 语法中加[]的是可有可无的&#xff0c;group by一般和having一起使用 select 分组字段/聚合函数 from 表名 [where 条件] group by 分组列名 [having 条件] [order by …

3DEXPERIENCE云端项目管理小工具--Project Planner项目策划者角色

云端3DEXPERIENCE平台提供了一个协作环境&#xff0c;使企业和个人能够以全新的方式实现创新。它将人员、创意、数据和解决方案连接到一个始终在线且可用的协作和交互环境中&#xff0c;可以帮助您的企业提高执行力、生产率并加速创新。 3DEXPERIENCE中的Project Planner项目策…

操作系统 day02(特征和发展历程)

一&#xff0c;操作系统的特征 并发和并行 共享 并发和共享互为存在条件 虚拟 异步 综上所述&#xff1a; 二&#xff0c;操作系统的发展历程

基于图神经网络的联邦学习跨企业推荐

Federated Learning-Based Cross-Enterprise Recommendation With Graph Neural Networks 论文试图解决什么问题 该论文试图解决跨企业推荐系统中存在的数据共享和用户隐私保护的问题。在许多小型和中型企业中&#xff0c;由于资源有限&#xff0c;无法提供足够的数据来进行大…