242.有效的字母异位词
分析题目
题目要求判断两个字符串是否为彼此的异位词,也就是说字母相同但排列顺序不同。这道题的第一想法是通过两层循环判断,但是复杂度过高。
解决
另一种方法是使用数组(也就是一个简易的哈希表),通过建立一个长度为26的数组,第一次遍历字符串s并储存各个字母出现的次数;第二次遍历字符串t检查字符串t中是否出现这些元素。
代码如下:
var isAnagram = function(s, t) {
if(s.length !== t.length) return false
let setArr = new Array(26).fill(0)
let aCode = 'a'.charCodeAt()
for(let i of s) {
setArr[i.charCodeAt() - aCode]++
}
for(let i of t) {
if(!setArr[i.charCodeAt() - aCode]) return false
setArr[i.charCodeAt() - aCode]--
}
return true
};
349. 两个数组的交集
分析题目
题目要求返回两个数组的交集,注意输出结果中的每个元素是唯一的。这时候我们就可以想到一个去重的好的结构——set。
解决
将其中更长的数组放入一个set中,当这个set中含有另一个数组的元素时,将元素放入结果set中。
代码如下:
var intersection = function(nums1, nums2) {
if(nums1.length < nums2.length) {
let temp = nums1
nums1 = nums2
nums2 = temp
}
const nums1Set = new Set(nums1)
const resSet = new Set()
for(let i of nums2) {
nums1Set.has(i) && resSet.add(i)
}
return Array.from(resSet)
};
Array.from()
Array.from()方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
Array.from(arrayLike, mapFn, thisArg)
其中arrayLike为想要转换成数组的伪数组对象或可迭代对象。mapFn如果指定了该参数,新数组中的每个元素会执行该回调函数。thisArg可选参数,执行回调函数 mapFn 时 this 对象。后两个为可选值。
也可以使用箭头函数,比如:
console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]
202. 快乐数
分析题目
题目要求判断一个数是否为快乐数。快乐数就是不断将数的每一位平方加和最后能得一的数。题目给出,一个数有两种情况:一种是最后变为1为快乐数,另一种是无限循环始终变不到1。
解决
有循环意味着有重复的数,可以使用Map结构。将平方和存入Map中,若出现重复则返回false。
代码如下:
var isHappy = function(n) {
let myMap = new Map()
const getSum = (num) => {
let sum = 0
while(n) {
sum += (n % 10) ** 2
n = Math.floor(n / 10)
}
return sum
}
while(true) {
if(myMap.has(n)) return false
if(n === 1) return true
myMap.set(n,1)
n = getSum(n)
}
};
1. 两数之和
分析题目
两数之和真的是梦开始的地方啦,在这里学会了输出,开始了算法的征程。
题目很简单,给一个target找到数组中的两个数,和为target
解决
之前用暴力的方法AC了一次,这次使用哈希表相关的知识。使用了JavaScript的对象,通过对象的特性解决这道题。
代码如下:
var twoSum = function(nums, target) {
let hash = {}
for(let i = 0;i < nums.length;i++) {
if(hash[target - nums[i]] !== undefined) {
return [i,hash[target - nums[i]]]
}
hash[nums[i]] = i
}
return []
};