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

55 阅读1分钟

242. 有效的字母异位词

先把一个字符串中的每个字符和次数放到map中,在用另一个字符串的每个字符和次数去消减map,最后如果map中所有字符的次数都是0,则说明是异位词,否则不是

function isAnagram(s: string, t: string): boolean {
  const m = new Map<string, number>()
  for (const c of s) {
    m.set(c, (m.get(c) || 0) + 1)
  }
  for (const c of t) {
    m.set(c, (m.get(c) || 0) - 1)
  }
  return !Array.from(m.values()).filter(e => e).length
};

349. 两个数组的交集

这个很简单,结合使用map和set就可以了

function intersection(nums1: number[], nums2: number[]): number[] {
  const m = new Map<number, number>()
  for (const n of nums1) {
    m.set(n, (m.get(n) || 0) + 1)
  }
  const s = new Set<number>()
  for (const n of nums2) {
    if (m.get(n) && !s.has(n)) {
      s.add(n)
    }
  }
  return [...s]
};

202. 快乐数

快乐数主要有一点,就是出现了两次相同的数(循环)那就说明一定不是快乐数了,所以可以用set在一个while(true)里或递归里记录是否出现循环

function isHappy(n: number): boolean {
  const s: Set<number> = new Set()
  while (true) {
    if (s.has(n)) {
      return false
    }
    s.add(n)
    n = sum(n)
    if (n === 1) {
      return true
    }
  }
};

function sum(n: number) {
  let sum = 0
  for (const c of String(n)) {
    sum += Math.pow(Number(c), 2)
  }
  return sum
}
function isHappy(n: number): boolean {
  return _isHappy(n, new Set())
};

function _isHappy(n: number, s: Set<number>) {
  let sum = 0
  for (const c of String(n)) {
    sum += Math.pow(Number(c), 2)
  }
  if (sum === 1) {
    return true
  }
  if (s.has(sum)) {
    return false
  }
  s.add(sum)
  return _isHappy(sum, s)
}

1. 两数之和

用map记录数字和索引,遍历时先找target-n是否已在map里存在,存在直接返回这两个索引就行了

function twoSum(nums: number[], target: number): number[] {
  const m: Map<number, number> = new Map()
  for (let i = 0; i < nums.length; i++) {
    const n = nums[i]
    const d = target - n
    if (m.has(d)) {
      return [i, m.get(d)]
    }
    m.set(n, i)
  }
};