用JavaScript写 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 | 代码随想录训练营Day5

84 阅读2分钟

哈希表基础

了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。

什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,大家在做哈希表题目都要思考这句话。

242.有效的字母异位词

本题要点

使用长度为26的数组进行统计

str.charCodeAt(index)

index 一个大于等于 0,小于字符串长度的整数。如果不是一个数值,则默认为 0。

返回值 指定 index 处字符的 UTF-16 代码单元值的一个数字;如果 index 超出范围,charCodeAt() 返回 NaN。

every()方法

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。

every() 方法使用指定函数检测数组中的所有元素:

如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。

如果所有元素都满足条件,则返回 true。

注意: every() 不会对空数组进行检测。

注意: every() 不会改变原始数组。

代码实现

function isAnagram(s: string, t: string): boolean {
  if(s.length !== t.length) return false;
  let record = new Array(26).fill(0);
  let base = 'a'.charCodeAt(0);
  for(let i = 0; i < s.length; i++){
    record[s.charCodeAt(i) - base]++;
    record[t.charCodeAt(i) - base]--;
  }
  return record.every((item) => item === 0)
};

349. 两个数组的交集

本题要点

Set数据结构在JS中属于ES6新特性,可以拓展开讲讲。

求数组交集在JS中可以结合数组API来实现,详情见后。

代码实现

使用Set并迭代其中一个数组

function intersection(nums1: number[], nums2: number[]): number[] {
  let retSet: Set<number> = new Set();
  let tempSet: Set<number> = new Set(nums1);
  for(let i of nums2){
    if(tempSet.has(i)){
      retSet.add(i);
    }
  }
  return Array.from(retSet);
};

使用Set结合filter

function intersection(nums1: number[], nums2: number[]): number[] {
  return Array.from(new Set(nums1.filter((item) => nums2.includes(item))));
};
//不难理解,filter求出公共元素,再用Set去重

202. 快乐数

本题要点

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

调用了JS数组API

代码实现

function isHappy(n: number): boolean {
  // 计算数的各个位数的平方和
  function calcSum(val: number): number{
    return String(val).split('').reduce((pre, cur) => pre + Number(cur) * Number(cur), 0);
  }
  let sumSet:Set<number> = new Set();
  // 不保留n的原始值,直接用n存sum的值 妙啊!
  while(n !== 1 && !sumSet.has(n)){
    sumSet.add(n);
    n = calcSum(n);
  }
  return n === 1;
};

1. 两数之和

本题要点

哈哈哈,两数之和作为力扣第一题真的是梦开始的地方了。

代码实现

function twoSum(nums: number[], target: number): number[] {
  let sumMap:Map<number, number> = new Map(),
  index:undefined | number = undefined,
  retArr:number[] = new Array();
  for(let i = 0; i < nums.length; i++){
    index = sumMap.get(target - nums[i]);
    if(index !== undefined){
      retArr = [i, index];
    }
    sumMap.set(nums[i], i);
  }
  return retArr;
};