01.有效的字母异位词
思路:创建一个长度为26的数组,数组中的每个元素代表着字母出现的次数。循环遍历两个字符串,前面的字符串出现的字母在数组中加一,第二个数组出现的字母在数组中减一。遍历完成后,数组中的每个元素都为0,代表着这两个字符串互为异位词。
function isAnagram(s: string, t: string): boolean {
if (s.length !== t.length) return false
let hash:number[] = Array(26).fill(0);
const subtracted = 'a'.charCodeAt(0)
for (let i = 0; i < s.length; i++) {
hash[s[i].charCodeAt(0) - subtracted]++
hash[t[i].charCodeAt(0) - subtracted]--
}
console.log(hash)
return hash.every(item => item == 0)
};
02.两个数组的交集
思路:利用Set去重的特性,将nums1数组去重,然后遍历nums2,判断nums1Set里是否有nums2中的元素,。如果有的话,加入到resSet中
function intersection(nums1: number[], nums2: number[]): number[] {
const nums1Set:Set<number> = new Set(nums1);
let resSet:Set<number> = new Set()
for (let i = 0; i < nums2.length; i++) {
if (nums1Set.has(nums2[i])) resSet.add(nums2[i])
}
return Array.from(resSet)
};
03.快乐数
思路:创造一个切割字符串并且累加的函数calcSum,用于将该数替换为它每个位置上的数字的平方和。使用set存储每次得出的平方和,直到n重复出现,然后判断n是否等于1。
function isHappy(n: number): boolean {
const calSum = (n:number) => {
return String(n).split('').reduce((prev, cur) => prev + Number(cur) ** 2, 0)
}
let hash:Set<number> = new Set()
while (n != 1 && !hash.has(n)) {
hash.add(n)
n = calSum(n)
}
return n == 1
};
04.两数之和
思路:使用Map存储键值对(元素,元素下标),map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)
function twoSum(nums: number[], target: number): number[] {
const numMap:Map<number, number> = new Map()
let index:number | undefined;
let res:number[] = []
for (let i = 0; i < nums.length; i++) {
index = numMap.get(target - nums[i])
if (index !== undefined) {
res = [i, index]
}
numMap.set(nums[i], i)
}
return res
};