LeetCode_Day5 | 有效的字母异位词、两个数组的交集、快乐数!

news2024/11/25 1:41:53

LeetCode_哈希表

  • 242.有效的字母异位词
    • 1.题目描述
    • 2.题解
  • 349.两个数组的交集
    • 1.题目描述
    • 2.题解
  • 202.快乐数
    • 1.题目描述
    • 2.题解
      • 思路(官方题解啊!看了好几遍真难)
    • 算法
    • 代码实现
    • 复杂度分析

242.有效的字母异位词

1.题目描述

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

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

示例:
输入: s = “anagram”, t = “nagaram”
输出: true

输入: s = “rat”, t = “car”
输出: false

详情leetcode链接

2.题解

先看思路哦!

class Solution {
    /**
     * 思路:需要一个额外的数组记录两个字符串每个字母出现的次数,一个次数增加,
     *       一个次数减少;若最后每个数组上每个数字都中和为0则为字母异位词。
     *     1.因为都是小写字母,所以需要定义一个数组record来记录每个字母出现的次数;
     *     2.因为字符a到字符z的ASCII也是26个连续的数,所以数组大小为 26,初始化为0;
     *     3.需要把字符映射到数组也就是哈希表的索引下标上:因为字符a到字符z的ASCII是
     *  26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。
     *     4.再遍历 字符串s的时候,只需要将 s[i] - ‘a’、‘b’等所在的元素做+1 操,同
     *  样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。 
     *     5.最后record数组如果有的元素不为零0,即字符串s和t一定是谁多了字符或者谁少
     *  了字符,return false。若record数组所有元素都为零0,说明字符串s和t是字母异位
     *  词,return true。
     * 时间复杂度:O(m+n),分别遍历了字符串s和t,长度设为 m 和 n(补充:因为数组长度与输入参数无关且为常量可看作O(1)可忽略不计,这里的m和n是和输入字符串长度有关,所以为m+n)
     * 空间复杂度:O(1)
     *     
     *
     */
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];
		//例如字符串s="aee",字符串t="eae"
		//s.charAt(a)-'a'=0,即recored数组的第一个位置,刚好与a~z相映射
        for (int i = 0; i < s.length(); i++){
            record[s.charAt(i)-'a']++; //charAt()即返回指定索引处的字符,举例字符a返回97。并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
        }

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

        for (int count : record){
            if (count != 0){  // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }

        return true; // record数组所有元素都为零0,说明字符串s和t是字母异位词
    }
}

349.两个数组的交集

1.题目描述

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

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

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

详情leetcode链接

2.题解

先看思路哦!

class Solution {

    /**
     * 思路:哈希set
     *      题目中提到输出结果中的每个元素一定是唯一的,即输出的结果的去重的, 同时可以不考虑输出结果的顺序,所以用哈希set做比较合适
     *      首先遍历数组nums1,将nums1映射到set1中。
     *      接着遍历数组2的过程中判断哈希表set1中是否存在该元素,若存在则放到reSet(用于返回的set)中,最后将结果集转为数组返回。
     * 注意:此题也可以使用数组来做哈希的题目,是因为题目都限制了数值的大小。如果本题没有限制数值的大小,就无法使用数组来做哈希表了。
     * 时间复杂度:O(m + n):假设数组nums1长度为m,nums长度为n。分别遍历
     * 空间复杂度:O(m): 定义了两个set,其大小取决于nums的大小
     *
     */
    public int[] intersection(int[] nums1, int[] nums2) {
        if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
            return new int[0];
        }
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> reSet = new HashSet<>();
        //遍历nums1映射到set1
        for (int i: nums1) {
            set1.add(i);
        }

        //遍历nums2过程中判断set1中是否存在该元素,存在放到reSetzh
        for (int i : nums2){
            if (set1.contains(i)){
                reSet.add(i);
            }
        }

        //将结果集转为数组返回
        return reSet.stream().mapToInt(x->x).toArray();

        // //方法2:将结果集转为数组返回
        // int[] array = new int[reSet.size()];
        // int j = 0;
        // for (int i : reSet){
        //     array[j++] = i;
        // }
        // return array;

    }
}

202.快乐数

1.题目描述

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

「快乐数」 定义为:

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

示例 1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:
输入:n = 2
输出:false

详情leetcode链接

2.题解

思路(官方题解啊!看了好几遍真难)

  • 根据题意确定边界:(1)最终会得到1;(2)最终会进入循环

  • 举例1,例如7——>72=49——>42+92=97…(不断循环此过程),如图直到1
    在这里插入图片描述

  • 举例2,从 116开始。通过反复通过平方和计算下一个数字,我们最终得到 58,再继续计算之后,我们又回到 58。由于我们回到了一个已经计算过的数字,可以知道有一个循环,因此不可能达到 1。
    在这里插入图片描述

  • 所以根据穷举,猜测会有以下三种可能。
    最终会得到 11。
    最终会进入循环。
    值会越来越大,最后接近无穷大。

  • 对于第三种情况的思考:我们怎么知道它会继续变大,而不是最终得到 1 呢?可以仔细想一想,每一位数的最大数字的下一位数是多少。
    在这里插入图片描述

  • 对于 3位数的数字,它不可能大于 243。这意味着它要么被困在 243以下的循环内,要么跌到 1。4 位或 4 位以上的数字在每一步都会丢失一位,直到降到 3 位为止。所以我们知道 最坏的情况下,算法可能会在 243 以下的所有数字上循环,然后回到它已经到过的一个循环或者回到 1。但它不会无限期地进行下去,所以我们排除第三种选择。

算法

算法分为两部分,我们需要设计和编写代码。

  1. 给一个数字 n,它的下一个数字是什么?
  2. 按照一系列的数字来判断我们是否进入了一个循环。

第 1 部分我们按照题目的要求做数位分离,求平方和。

第 2 部分可以使用哈希集合完成。每次生成链中的下一个数字时,我们都会检查它是否已经在哈希集合中。
如果它不在哈希集合中,我们应该添加它。
如果它在哈希集合中,这意味着我们处于一个循环中,因此应该返回 false。

注意: 我们使用哈希集合而不是向量、列表或数组的原因是因为我们反复检查其中是否存在某数字。检查数字是否在哈希集合中需要 O(1)的时间,而对于其他数据结构,则需要 O(n)的时间。

代码实现

/**
 * 202.快乐数
 * 1)给定一个数n,获取下一个数是什么?
 * 2)按照一系列的数字来判断我们是否进入了一个循环
 * 时间复杂度:O(logn)
 * 空间复杂度:O(logn)
 */
class Solution {

    public static int getNext(int n){
        int totalSum = 0;
        while (n>0){
            int d = n % 10;//取余数获得个位上的数字
            n = n / 10;//取商获得十位上的数字
            totalSum += d*d;
        }
        return totalSum;
    }

    public static boolean isHappy(int n){
        Set<Integer> seen = new HashSet<>();//利用set判断重复
        while (n != 1 &&  !seen.contains(n)){
            seen.add(n);
            n = getNext(n);
        }
        return n==1;
    }
}

复杂度分析

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

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

相关文章

滑块验证码------啥?你居然还在手动滑动,你不来试试自动滑动吗

测试网站 测试网站:https://www.geetest.com/demo/slide-float.html 我的giteer:秦老大大 (qin-laoda) - Gitee.com里面有我写的代码 作者备注:由于我个人原因,文章写得感觉太长,后面我会把一个知识分成多部文章,这样可以简单明了的看到了 验证码的思路有两种:一种是通过se…

港科夜闻|香港科大取得重大科研突破,首度利用人工智能为阿尔兹海默症作早期风险预测...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大取得重大科研突破&#xff0c;首度利用人工智能为阿尔兹海默症作早期风险预测。香港科大校长叶玉如教授及香港科大陈雷教授带领的研究团队&#xff0c;最近开发了一套人工智能模型&#xff0c;利用遗传信息&…

WTM框架运行报错0308010C:digital envelope routines::unsupported

WTM框架运行报错0308010C:digital envelope routines::unsupported 错误描述报错原因解决方式 错误描述 我所使用WTM搭建的程序是选择的.net5.0Vue前后端分离的方式&#xff0c;项目结构选择的是“各层分离的多个项目”&#xff1b;本人并非初次使用WTM平台框架搭建项目&#…

usb 电气特性

usb 电气特性 usb 的连线 在usb 3.0 之前都有插拔方向的 只有一边有接触点 标准usb连线使用4芯电缆: 5v电源线(VBus)、差分数据线负&#xff08;D-&#xff09;差分数据线正(D&#xff09;及地线&#xff08;GND&#xff09;主要传输数据就是中间二个 D 和D- usb的数据传输…

基于 Wav2Lip-GFPGAN 深度学习模型的数字人Demo

写在前面 工作中遇到简单整理博文为 Wav2Lip-GFPGAN 环境搭建运行的 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是…

人工智能(pytorch)搭建模型10-pytorch搭建脉冲神经网络(SNN)实现及应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型10-pytorch搭建脉冲神经网络&#xff08;SNN&#xff09;实现及应用&#xff0c;脉冲神经网络&#xff08;SNN&#xff09;是一种基于生物神经系统的神经网络模型&#xff0c;它通过模拟神…

ASP.NET Core Web API入门之二:Swagger详细使用

ASP.NET Core Web API入门之二&#xff1a;Swagger详细使用 一、引言二、Swagger的作用以及优点2.1 作用2.2 优点 三、API接口添加注释3.1 编辑项目文件3.2 修改 Startup.cs 文件的 ConfigureServices 方法3.3 修改浏览器的网页标题3.4 接口添加注释 四、运行后效果 一、引言 …

(六)矢量数据的空间分析——缓冲区分析

矢量数据的空间分析——缓冲区分析 目录 矢量数据的空间分析——缓冲区分析 1.基本概念1.1图解1.2缓冲距离1.2.1固定距离1.2.2由字段决定的距离 2.缓冲区的建立2.1操作步骤2.1.1点状要素建立缓冲区2.1.2面状要素建立缓冲区 缓冲区是一组或一类地图要素&#xff08;点、线、面&a…

1.Tocmcat部署

文章目录 Tomcat部署介绍部署Tomcat安装jdk安装Tomcat添加tomcat系统服务 Tomcat部署虚拟主机tomcat多实例部署 Tomcat部署 Tomcat安装部署虚拟主机配置Tomcat优化 介绍 免费的、开放源代码的Web应用服务器Apache软件基金会(Apache Software Foundation)Jakarta项目中的- -个…

华为OD机试真题B卷 JavaScript 实现【5键键盘的输出】,附详细解题思路

一、题目描述 有一个特殊的5键键盘&#xff0c;上面有a&#xff0c;ctrl-c&#xff0c;ctrl-x&#xff0c;ctrl-v&#xff0c;ctrl-a五个键。 a键在屏幕上输出一个字母a&#xff1b;ctrl-c将当前选择的字母复制到剪贴板&#xff1b;ctrl-x将当前选择的字母复制到剪贴板&#…

【算法系列之哈希表I】leetcode15. 三数之和

242.有效的字母异位词 力扣题目链接 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 **注意&#xff1a;**若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 输入: s "anagram", t "nag…

快来给你个人微信公众号认个证吧

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 作者安全运维学习答疑交流群&#xff1a;请关注公众号回复【学习交流群】 今天我一改往日&#xff0c;不谈技术只谈谈关于个人公众号认证流程&#xff0c;突然感觉自己有点不务正业了&#xf…

go语言学习——9

文章目录 goroutine概念goroutine调度模型 channelchannel介绍定义/声明channelchannel的关闭channel遍历channel其他细节 goroutine 前言&#xff1a;统计1~90000000数字中&#xff0c;哪些是素数&#xff1f; 使用循环&#xff0c;很慢使用并发或者并行的方式&#xff0c;将任…

【数据结构】二叉树(二)

目录 一、二叉树链式结构及实现 1、二叉树的结构 2、二叉树的遍历 2.1 前序遍历 2.2 中序遍历 2.3 后序遍历 2.4 层序遍历 3、二叉树链式结构的实现 3.1 创建一个节点 3.2 二叉树节点个数 3.3 二叉树叶子节点个数 3.4 二叉树的高度 3.5 二叉树第k层节点个数 3.6 二叉树查找值…

数据库管理-第八十二期 EMCC升级教程(20230607)

数据库管理 2023-06-07 第八十二期 EMCC升级教程1 升级EMCC1.1 升级概览1.2 拷贝相关文件1.3 升级OPatch1.4 升级OMSPatcher1.5 升级WLS1.6 升级OMS 2 升级Agent2.1 升级概览2.2 拷贝相关文件2.3 安装或升级AgentPatcher2.4 升级agent 3 升级Oracle数据库ASH包总结 第八十二期 …

什么时候适合加一层?

加一层能解决问题&#xff1a; 为什么加一层能解决问题&#xff1f; 什么时候适合加一层&#xff1f; 销售说不吵的&#xff0c; 道路检测说没有超标。 业主就是睡不着。 吃瓜群众说你为啥买那边的房子。 销售说开发商骗他&#xff0c;他也是受害者。 结果没问题&#xff0…

CSS 样式语言 选择器

CSS介绍 层叠样式表&#xff0c;是一种样式表语言&#xff0c;用来描述HTML和XML文档的呈现。随着HTML的发展&#xff0c;为了满足页面设计者的要求&#xff0c;HTML添加了很多显示功能&#xff0c;但是随着这些功能的增加&#xff0c;使得HTML越来越杂乱&#xff0c;HTML 页面…

「企业安全架构」EA874:安全需求,愿景、原则和流程

安全需求愿景 在开始任何安全架构工作之前&#xff0c;定义安全需求是很重要的。这些需求应该受到业务上下文和通用需求远景文档的影响。下面是一个图表&#xff0c;它显示安全需求是企业信息安全体系结构中业务上下文的一部分。 图1 安全需求远景&#xff08;SRV&#xff09;有…

Android系统原理性问题分析 - 系统 Root 的实现原理

声明 在Android系统中经常会遇到一些系统原理性的问题&#xff0c;在此专栏中集中来讨论下。Android低版本时经常听说Root系统&#xff0c;随着Android版本的升高&#xff0c;提Root的人越来越少了。不过我在系统开发时也有客户提出为系统Root的需求&#xff0c;所以在这里分析…

【产品经理】用户增长方法论

在做用户增长为核心的产品运营推广前&#xff0c;我们应从几个方面入手——打造核心功能点、转化方式要清晰、用户反馈与转化、传播渠道要合适、建立病毒式传播规则。 2017年&#xff0c;以营销见长的可口可乐公司将设置了24年之久的首席营销官&#xff08;CMO&#xff09;撤销…