代码随想录算法训练营第五天 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

63 阅读3分钟

242.有效的字母异位词

代码随想录 (programmercarl.com)

分析题目

题目要求判断两个字符串是否为彼此的异位词,也就是说字母相同但排列顺序不同。这道题的第一想法是通过两层循环判断,但是复杂度过高。

解决

另一种方法是使用数组(也就是一个简易的哈希表),通过建立一个长度为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 []
};