242. 有效的字母异位词
题目:
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的 字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
思路:
比较两个字符串中相同字母出现的频率即可,遍历两个字符串,将第一个字符串的字符个数添加到 hash
表中,遍历第二个字符串的时候,从 hash
表中删除对应的字符,最后判断 hash 表是否为 0 ,如果为 0 则说明两个字符串是字母异位词,不为 0 则不是。
var isAnagram = function(s, t) {
let hash = new Array(26).fill(0) // 只需要考虑小写字母
for(let i = 0; i < s.length; i++){
hash[s.charCodeAt(i) - 'a'.charCodeAt(0)]++ // 这步是进行ASCII码的计算,假设s中有个字符是b,它的ASCII码 - a的ASCII码 = 1,所以它就存在了hash表索引为1的位置。
}
for(let i = 0; i < t.length; i++){
hash[t.charCodeAt(i) - 'a'.charCodeAt(0)]--
}
return hash.every((item) => (item ===0))
}
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]
思路:
hash 表用Set()
判断 nums 2
中的元素是否在 nums 1
中出现过,并且返回的不能是重复的数据,最好的方法就是使用 Set()
,因为 Set()
是自动去重的,先通过将 nums 1
数组传入 Set()
,生成一个 Set()
集合,在通过 .has()
方法判断 nums 2
中的元素是否在集合中,如果在,则通过 .add()
方法传入 result
集合中,由于最后输出的是数组,需要将 result
集合转换成数组,通过 Array.from()
方法。
var intersection = function(nums1, nums2) {
let hash = new Set(nums1)
let result = new Set()
for(let i = 0; i < nums2.length; i++){
if(hash.has(nums2[i])){
result.add(nums2[i])
}
}
return Array.from(result)
}
hash 表用数组
由于题目限定,先构建一个长度大于 1000
的数组,并通过遍历将 nums 1
的元素全部储存到数组的对应位置,再通过遍历 nums 2
,判断 nums 2
的元素是否在 nums 1
中,如果对应位置已经有了元素,则将该元素储存到 result
集合中,并通过 Array.from()
方法转换为数组。
var intersection = function(nums1, nums2) {
let hash = new Array(1005).fill(0)
let result = new Set()
for(let i = 0; i < nums1.length; i++){
hash[nums1[i]] = 1
}
for(let i = 0; i < nums2.length; i++){
if(hash[nums2[i] === 1){
result.add(nums2[i])
}
}
return Array.from(result)
}
202. 快乐数
题目:
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果n
是 快乐数 就返回true
;不是,则返回false
。
示例 1:
输入:n = 19
输出:true
示例 2:
输入:n = 2
输出:false
思路:
主要是判断计算结果是否是1
,如果发生循环,则就不是快乐数,发生循环说明计算结果出现的相同的数字,通过比对之前的数,发现现在的数已经出现过,所以使用哈希表,并且使用Set()
防止重复的情况。
function sum(n){
let sum = 0
while(n > 0){
let sqrt = n % 10
sum += sqrt * sqrt
n = Math.floor(n / 10)
}
return sum
}
var isHappy = function(n) {
let hash = new Set()
while(n !== 1){
if(hash.get(n)){
return false
}
hash.add(n)
n = sum(n)
}
return true
}
1. 两数之和
题目:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
思路:
暴力法
两次循环遍历所有的结果
var twoSum = function (nums, target) {
let res = 0
for(let i = 0;i <= nums.length - 1;i++){
for(let j = i + 1; j <= nums.length - 1;j++){
if(nums[i] + nums[j]===target){
return [i,j]
}
}
}
};
哈希表
要考虑为什么用哈希表,为什么用 Map()
。因为是其实是判断是否遍历过某一个元素,也就是该元素是否出现在集合中,这个时候就可以使用 hash
表。Map()
在这题的作用是用来存储遍历过的元素的值和在数组中的下标,以此来返回结果。
var twoSum = function (nums, target) {
let hash = new Map()
for(let i = 0; i < nums.length; i++){
if(hash.has(target - nums[i])){
return [hash.get(target - nums[i]), i]
}
hash.set(nums[i], i)
}
}