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

83 阅读1分钟

242.有效的字母异位词

349. 两个数组的交集

202.快乐数

1.两数之和

242.有效的字母异位词

var isAnagram = function(s, t) {
    const map = new Array(26).fill(0);

    for (const cs of s) {
        map[cs.charCodeAt() - 'a'.charCodeAt()] += 1;
    }
    for (const ct of t) {
        map[ct.charCodeAt() - 'a'.charCodeAt()] -= 1;
    }

    let res = true;
    for (const m of map) {
        if (m !== 0)    return false;
    }
    return res;
};

349. 两个数组的交集

  • 关键词:Set 用来去重
  • better思路:内部去重->比较->结果去重
var intersection = function(nums1, nums2) {
    const set = new Set([...nums1, ...nums2]);
    const res = [];
    for (const v of set.values()) {
        if (nums1.indexOf(v) !== -1 && nums2.indexOf(v) !== -1) {
            res.push(v);
        }
    }
    return res;
};

var intersection = function(nums1, nums2) {
    const set1 = new Set(nums1);
    const res = new Set();

    for (const n of nums2) {
        if (set1.has(n)) {
            res.add(n);
        }
    }
    return Array.from(res);
};

202.快乐数

  • 关键点:get 到sum重复则一定死循环
  • another point:用标准求和(用字符串的方式做比较好想但耗时长)

p.s. 解答里的环形链表思想感觉有点东西233

var isHappy = function(n) {
    const res = new Set();
    let sum = n;
    while(1) {
        _n = Array.from(`${sum}`).map(n => +n);
        console.log(_n);
        sum = _n.reduce((prev, curr) => (prev + (curr * curr)), 0);
        console.log(sum);
        if (sum === 1)  return true;

        if (!res.has(sum)) {
            res.add(sum);
        } else {
            return false;
        }
    }
};

1.两数之和

  • 关键点:根据target找目标值 “反着找”!
var twoSum = function(nums, target) {
    const map = new Map();

    for (let i=0; i<nums.length; i++) {
        const next = target - nums[i];
        if (map.has(next)) {
            return [i, map.get(next)];
        } else {
            map.set(nums[i], i);
        }
    }
};