1. 两数之和
题目点击前往
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例1:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例2:
12输入:nums = [3,2,4], target = 6输出:[1,2]
示例3:
12输入:nums = [3,3], target = 6输出:[0,1]
解题思路123456789101112131415/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function(nums, target) { let ...
202. 快乐数
题目点击前往
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1:
12输入:n = 19输出:true
示例 2:
12输入:n = 2输出:false
解题思路
创建sum函数用于取模求和。
创建哈希表用于存储求和的值,利用循环来判断当重复出现某个和的时候说明出现循环。
1234567891011121314151617181920212223242526/** * @param {number} n * @return {boolean} */function sum(n){ let total = 0; while(n){ total += (n % 10) ** 2; n = Math. ...
350. 两个数组的交集 II
题目点击前往
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
12输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]
示例 2:
12输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]
解题思路
将nums1和nums2用哈希表替换。
比较对应键值的大小,返回较小的。
12345678910111213141516171819202122232425/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */var intersect = function(nums1, nums2) { let hashmap1 = new Map(); let h ...
349. 两个数组的交集
题目点击前往
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
12输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]
示例 2:
123输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]解释:[4,9] 也是可通过的
解题思路方法一:
利用哈希表,存储nums1中的值。
遍历nums2,如果哈希表中含有这个值,则将其存在result中。
1234567891011121314151617181920/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */var intersection = function(nums1, nums2) { let hashmap = new Map(); let result = new A ...
438. 找到字符串中所有字母异位词
题目点击前往
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
12345输入: s = "cbaebabacd", p = "abc"输出: [0,6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
123456输入: s = "abab", p = "ab"输出: [0,1,2]解释:起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab ...
49. 字母异位词分组
题目点击前往
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
12输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
12输入: strs = ["a"]输出: [["a"]]
示例 3:
12输入: strs = [""]输出: [[""]]
解题思路
利用哈希表。
首先将数组中每个字符串按字母组成由大到小进行排序并保存在新的数组中,保证原数组与新数组元素索引一致。
对 ...
383. 赎金信
题目点击前往
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
12输入:ransomNote = "a", magazine = "b"输出:false
示例 2:
12输入:ransomNote = "aa", magazine = "ab"输出:false
示例 3:
12输入:ransomNote = "aa", magazine = "aab"输出:true
解题思路
利用哈希表。
首先遍历magazine,将组成magazine的字符以及其出现的次数用哈希表表示。
然后遍历ransomNote,将哈希表中存在的值进行减操作。
如果哈希表中所有value均大于等于0,那么就符合题目条件。
12345678910111213141 ...
242. 有效的字母异位词
题目点击前往
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
12输入: s = "anagram", t = "nagaram"输出: true
示例 2:
12输入: s = "rat", t = "car"输出: false
解题思路
利用哈希表。
首先遍历s,将组成s的字符以及其出现的次数用哈希表表示。
然后遍历t,将哈希表中存在的值进行减操作。
如果两者互为字母异位词,那么哈希表中所有value均为0。
1234567891011121314151617181920212223242526272829/** * @param {string} s * @param {string} t * @return {boolean} */var isAnagram = function(s, t) ...
DataStructure-Hashtable
一、哈希表基础
哈希表是根据关键码的值而直接进行访问的数据结构。直白来讲其实数组就是一张哈希表。
哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。
哈希表都是用来快速判断一个元素是否出现集合里。
二、哈希函数例如要查询一个名字是否在这所学校里。
哈希函数,把学生的姓名直接映射为哈希表上的索引,然后就可以通过查询索引下标快速知道这位同学是否在这所学校里了。
哈希函数通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了。
如果hashCode得到的数值大于哈希表的大小,此时为了保证映射出来的索引数值都落在哈希表上,我们会在再次对数值做一个取模的操作,保证了一定可以映射到哈希表上了。
三、哈希碰撞
当多个值映射到同一个位置的时候,这一现象叫做哈希碰撞。
一般哈希碰撞有两种解决方法, 拉链法和线性探测法。
四、拉链法
将发生冲突的元素都被存储在链表中。
当需要访问的时候,直接访问发生冲突的索引即可。
其实拉链法就是要选择适当的哈希表的大小,这样既不 ...