一日一练

141 阅读1分钟

1. 二叉树的右视图

主要在于遍历的时候给节点加上对应的层级,然后扫描的时候确保每一层的最右侧节点最后被扫描到。可以使用前序或者中序遍历。

function rightSideView(root: TreeNode | null): number[] {
  const res: number[] = []
  // 中序遍历
  function dfs(node: TreeNode | null, level: number) {
    if (node === null) return
    res[level] = node.val
    node.left && dfs(node.left, level + 1)
    node.right && dfs(node.right, level + 1)
  }

  dfs(root, 0)

  return res
}

2. 相同的树

从根节点开始,递归标记当前节点及其左右节点,只有节点都存在且值相同才相同。

function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean {
  if (p === null && q === null) return true
  if (p === null || q === null || p.val !== q.val) return false
  return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
}

独特的电子邮件

主要是字符串操作,正则的使用

function numUniqueEmails(emails: string[]): number {
  const set = new Set<string>()
  for (let i = 0; i < emails.length; i++) {
    const addressParts = emails[i].split('@')
    let localName = addressParts[0]
    // replace
    // 1. 去到 .
    // 2. 去掉 + 及之后的内容
    localName = localName.replace(/\./g, '').replace(/\+[a-z]+/g, '')
    set.add(`${localName}@${addressParts[1]}`)
  }
  // 利用set的天然去重
  return set.size
}
```