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

85 阅读4分钟

242.有效的字母异位词

题目链接:242.有效的字母异位词

解题思路🤔

1、定义一个数组record,数组大小为26(因为字符a到字符z的ASCII是26个连续的数值),使用charCodeAt() 方法可返回指定位置的字符的 Unicode 编码,记录字符串s中字符出现的次数。
2、遍历 字符串s,只需要将 s[i] - ‘a’ 所在的元素做+1 操作即可。
3、遍历 字符串t,只需要将 t[i] - ‘a’ 所在的元素做-1 操作即可。
4、最后检查一下,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。

代码⌨️

var isAnagram = function(s, t) {
    if(s.length !== t.length) return false;
    const resSet = new Array(26).fill(0);
    const base = "a".charCodeAt();

    for(const i of s) {
        resSet[i.charCodeAt() - base]++;
    }
    for(const i of t) {
        if(!resSet[i.charCodeAt() - base]) return false;
        resSet[i.charCodeAt() - base]--;
    }
    return true;
};

相关题目🧐

  • 383.赎金信
  • 49.字母异位词分组
  • 438.找到字符串中所有字母异位词

总结👀

注意第二个循环遍历字符串t时:先进行数组是否有元素不为0的判断


349. 两个数组的交集

349. 两个数组的交集

解题思路🤔

1、求两个数组的交集,注意交集需去重
2、若题目没有限制数值的大小,不能用数组做哈希表。
如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费,不能用数组做哈希表。

3、把nums1转化为哈希表,把nums1中的所有数值放到哈希表里。 4、遍历nums2,查每一个元素是否在哈希表中出现过。 5、如果出现过,放入result集合里。注意集合去重。

代码⌨️

var intersection = function(nums1, nums2) {
    let num1 = new Set(nums1);
    let num2 = new Set();

    for (let key of nums2) {
        if(num1.has(key)) {
            num2.add(key);
        }
    }
    return Array.from(num2);
};

相关题目🧐

  • 350.两个数组的交集 II

总结👀

1、set结构不会添加重复的值。(经常用set解决去重问题)
2、set实例转数组:

const s = new Set([1, 2, 3]); 
Array.from(s);

3、set方法:

//add(): 添加元素:
const s = new Set(); s.add(1).add(2).add(3); 
Array.from(s); // [1, 2, 3]

//has(): 查询Set实例是否存在某元素(返回布尔值):
const s = new Set(); 
s.add(1).add(2).add(3); 
s.has(1); // true

//delete(): 删除Set实例中某个元素(返回布尔值):
const s = new Set(); 
s.add(1).add(2); 
s.delete(1); 
Array.from(s); // [2]

//clear(): 清空Set实例:
const s = new Set(); 
s.add(1).add(2).add(3); 
Array.from(s); // [1, 2, 3] 
s.clear(); 
Array.from(s); // []

4、迭代

  • key():返回键名
  • values():返回键值
  • entries():返回键值对
    键名=键值
  • for-of
  • forEach

202. 快乐数

题目链接:202. 快乐数

解题思路🤔

1、题目说了会出现两种情况:

  • 第一种:数变为1,是快乐数,返回true;
  • 第二种:无限循环,始终变不到1,返回false。 2、无限循环时,sum重复出现,用哈希法判断。

代码⌨️

// 方法一:使用map
var isHappy = function (n) {
    let m = new Map()

    const getSum = (num) => {
        let sum = 0
        while (n) {
            sum += (n % 10) ** 2
            n = Math.floor(n / 10)
        }
        return sum
    }

    while (true) {
        // n出现过,证明已陷入无限循环
        if (m.has(n)) return false
        if (n === 1) return true
        m.set(n, 1)
        n = getSum(n)
    }
}

// 方法二:使用环形链表的思想 说明出现闭环 退出循环
var isHappy = function(n) {
    if (getN(n) == 1) return true;
    let a = getN(n), b = getN(getN(n));
    // 如果 a === b 
    while (b !== 1 && getN(b) !== 1 && a !== b) {
        a = getN(a);
        b = getN(getN(b));
    }
    return b === 1 || getN(b) === 1 ;
};

// 方法三:使用Set()更简洁
/**
 * @param {number} n
 * @return {boolean}
 */

var getSum = function (n) {
    let sum = 0;
    while (n) {
        sum += (n % 10) ** 2;
        n =  Math.floor(n/10);
    }
    return sum;
}
var isHappy = function(n) {
    let set = new Set();   // Set() 里的数是惟一的
    // 如果在循环中某个值重复出现,说明此时陷入死循环,也就说明这个值不是快乐数
    while (n !== 1 && !set.has(n)) {
        set.add(n);
        n = getSum(n);
    }
    return n === 1;
};

// 方法四:使用Set(),求和用reduce
var isHappy = function(n) {
    let set = new Set();
    let totalCount;
    while(totalCount !== 1) {
        let arr = (''+(totalCount || n)).split('');
        totalCount = arr.reduce((total, num) => {
            return total + num * num
        }, 0)
        if (set.has(totalCount)) {
            return false;
        }
        set.add(totalCount);
    }
    return true;
};

总结👀

对数字每个位置上数字的平方进行求和。

const getSum = (num) => {
      let sum = 0
      while (n) {
          sum += (n % 10) ** 2
          n = Math.floor(n / 10)
      }
      return sum
}

1. 两数之和

题目链接:1. 两数之和

解题思路🤔

1、本题需要一个集合存放遍历过的元素,遍历数组时,询问集合,是否存在这个数组。
2、同时要知道该元素对应的下标,需要用key value结构存放。key存放数据元素,value存放数据元素对应的下标。(这道题要判断元素是否出现,所以key存放数据元素) 3、边遍历边寻找对应元素。

代码⌨️

var twoSum = function(nums, target) {
    let hash = {};
    for (let i = 0; i < nums.length; i++) {
        if (hash[target - nums[i]] !== undefined) {
            return [hash[target - nums[i]], i];
        }
        hash[nums[i]] = i;
    }
    return [];
};