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
}
```