242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明: 你可以假设字符串只包含小写字母。
解题思路
首先建立一个长度为26的数组,对应 a-z 字母,遍历字符串s,在数组中记录每个字母出现的个数。
接下来遍历字符串t,遍历时对字母对应数组的值做-1操作。
如果s 和 t 是异位字符串,那么经过操作后,数组的所有元素应该都是0. 遍历数组,如果数组元素皆为0,返回 true,否则返回 false.
var isAnagram = function(s, t) {
if(s.length !== t.length){
return false
}
let table = Array(26).fill(0)
for(let char of s){
table[char.charCodeAt('')-97] ++
}
for(let char of t){
table[char.charCodeAt('')-97] --
}
if(table.every(item => item===0)){
return true
}else{
return false
}
};
349. 两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。
解题思路
- 将 nums1 和 nums2 中的所有元素放入一个容器arr内,依次遍历arr 中的元素,并判断该元素是否同时属于两个数组。如果是,将该元素push 进结果数组。
var intersection = function(nums1, nums2) {
let res = new Set()
let arr = [...nums1,...nums2]
for(let num of arr){
if(nums1.includes(num)&&nums2.includes(num)){
res.add(num)
}
}
return [...res]
};
- 遍历nums1,将去重的结果为set1;创建结果res,接着遍历nums2,如果在nums2中遇到 set1 中的元素,且元素不在res 中,将该元素添加到结果中。
var intersection = function(nums1, nums2) {
let res = new Set()
let set1 = new Set(nums1)
for(let num of nums2){
if( set1.has(num) && !res.has(num)){
res.add(num)
}
}
return [...res]
};
202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
解题思路
这道题,在数字不断将自己替换为它每个数字上的平方和时,只有两种结果: 变为1 ,不停地循环。也就是说,我们记录下这个数字替换变化的过程history, 如果数字最终变为1,那么返回TRUE, 如果数字经过若干次变化后成为了history中的某个数字,那么它未来也将陷入此前history中记载的循环,返回false。
var isHappy = function(n) {
let history = []
while(n!==1){
let arr = n.toString().split('').map( item => +item * +item)
let sum = arr.reduce((pre,cur)=> pre+= cur,0)
if(history.includes(sum)){
return false
}
n = sum
history.push(sum)
}
return true
};
1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路
-
传统方法,双指针
-
一边遍历数组,一边使用map存储其值和对应的索引,计算当前值和目标值的差值,然后在map中查找,找到就返回两个索引值。
var twoSum = function(nums, target) {
let map = new Map()
for(let i=0;i<nums.length;i++){
let diff = target - nums[i]
if(map.has(diff)){
return [i,map.get(diff)]
}
map.set(nums[i],i)
}
};