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

本文主要是介绍代码随想录算法训练营第六天| 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

哈希表理论基础

[LeetCode] 242. 有效的字母异位词

[LeetCode] 242. 有效的字母异位词 文章解释

[LeetCode] 242. 有效的字母异位词 视频解释

题目:

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

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

示例 1:

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

示例 2:

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

提示:

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

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

自己看到题目的第一想法

    因为前一晚先看了视频, 加上之前自己实现过, 所以印象挺深的.

看完代码随想录之后的想法

    使用数组做哈希表, 哈希表的索引为字母在 26 个字母表的位置, 这样可以提高搜索的速度.

// 方案一: 这个方案对于 characterCount 中的数据做的剪发操作会比方案二多不少
// 因此在大量随机输入的情况下效率没有方案二高
class Solution {public boolean isAnagram(String s, String t) {if (s == null || t == null || s.length() != t.length()) {return false;}int[] characterCount = new int[26];for (int i = 0; i < s.length(); i++) {characterCount[s.charAt(i) - 'a']++;characterCount[t.charAt(i) - 'a']--;}for (int i = 0; i < characterCount.length; i++) {if (characterCount[i] != 0) {return false;}}return true;}
}
// 方案二
class Solution {public boolean isAnagram(String s, String t) {if (s == null || t == null || s.length() != t.length()) {return false;}int[] characterCount = new int[26];for (int i = 0; i < s.length(); i++) {characterCount[s.charAt(i) - 'a']++;}for (int i = 0; i < t.length(); i++) {characterCount[t.charAt(i) - 'a']--;if (characterCount[t.charAt(i) - 'a'] < 0) {return false;}}return true;}
}

自己实现过程中遇到哪些困难

    如果按照视频里的解法, 效率好像会稍微低一些, 将判断是否异位词的逻辑修改成每次对第二个字符串中的字符, 每减一就判断一次, 这样可以减少一些减法操作, 效率提升了一些.

[LeetCode] 349. 两个数组的交集

[LeetCode] 349. 两个数组的交集 文章解释

[LeetCode] 349. 两个数组的交集 视频解释

题目:

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

示例 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

自己看到题目的第一想法

    两个 for 循环, 再将相等的数据放到 Set 集合里.

看完代码随想录之后的想法

    通过 Set 保存一个数组的数据, 再通过另一个遍历另一个数组将同时出现在被遍历数组和 Set 中的数字, 保存到结果中并返回.

class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> comparedSource = new HashSet<>();for (int i = 0; i < nums1.length; i++) {comparedSource.add(nums1[i]);}List<Integer> result = new ArrayList<>();for (int i = 0; i < nums2.length; i++) {if (comparedSource.remove(nums2[i])) {result.add(nums2[i]);}}int[] resultArray = new int[result.size()];for (int i = 0; i < result.size(); i++) {resultArray[i] = result.get(i);}return resultArray;}
}

自己实现过程中遇到哪些困难

    Java 的 List<Integer> 转为 int[] 没找到合适的 API.

[LeetCode] 202. 快乐数

[LeetCode] 202. 快乐数 文章说明

题目:

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

「快乐数」 定义为:

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

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

示例 1:

输入:n = 19
输出:true
解释:(左边的数表示底数, 右边的数表示指数, 1^2则表示1的平方)
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

自己看到题目的第一想法

    1. 为什么一个整数的每个位置的数平方后, 再把这些平方值相加. 最终不是得到1, 就是得到一个循环的过程呢? 算了, 题目这么说就这么信吧!

    2. 既然会出现循环, 那就不能让程序出现死循环. 所以我要记录住每个数字拆解后出现的序列(这里就是愚蠢的开始), 如果后续再出现这个序列, 我就要终止比对. 如果出现需要判断一个对象是否出现在列表里, 就要考虑用哈希表! 我懂! 每个序列有长度, 我把相同长度的序列放在Map的同一个索引下, 与是愚蠢的 List<Integer, List<List<Integer>>> 出现了. 当然后面就越写越奇怪, 越写越乱.

    3. 在第2步的愚蠢之下, 迎来了意思曙光. 不管是 212、 122 还是 221, 如果出现循环的话, 最终一定会回到2^2+1^1+2^2=5, 所以只要5重复出现, 就表示循环了. 所以我要记录的只是所有数的平方和是否重复出现就可以了... 这么简单的道理我到底在复杂些什么?

看完代码随想录之后的想法

    如我看到题目的第一想法的第3步, 基本没有太多差别了. 算法的精妙就在于, 一旦想明白, 就会觉得豁然开朗以及否定自我. 为什么我会如此愚蠢呢, 这么简单的事情都没想到.

class Solution {public boolean isHappy(int n) {Set<Integer> squareSum = new HashSet<>();while ((n = getNumber(n)) != 1) {if (!squareSum.add(n)) {return false;}}return true;}private int getNumber(int number) {int result = 0;int currentNumber;while (number > 0) {currentNumber = number - (number/10)*10;result += currentNumber * currentNumber;number /= 10;}return result;}
}

自己实现过程中遇到哪些困难

    想明白了就很简单了, 没有遇到判断条件不确定等问题.

[LeetCode] 1. 两数之和

[LeetCode] 1. 两数之和 文章解释

[LeetCode] 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) 的算法吗?

自己看到题目的第一想法 

    嗯... 虽然看了视频, 依旧会看到之前自己的解答. 果然是爽循环 O(n^2) 的暴力解法.

看完代码随想录之后的想法

    x + y = z, 已知 z 和 y 的条件下, x 可知. 所以问题退化成寻找 x 是否在数组中出现. 当需要判断一个对象是否在数组中出现的时候, 考虑哈希表. 这里需要返回对应数字的下表, 因此需要用 Map, 将数字和数字所在的下标做一个映射.

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> existsNumbers = new HashMap<>();int[] result = new int[2];for (int i = 0; i < nums.length; i++) {if (existsNumbers.containsKey(target - nums[i])) {result[0] = existsNumbers.get(target - nums[i]);result[1] = i;return result;} else {existsNumbers.put(nums[i], i);}}return result;}
}

自己实现过程中遇到哪些困难

    无

这篇关于代码随想录算法训练营第六天| 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987547

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引