此阶段给自己定的目标是:做过的这些题每天坚持继续刷二遍,每道题做过之后开始尝试多解法尝试解题。上一阶段是感知都有什么题目,此阶段主要系统化常规题解套路知识,牢记牢记此阶段目的。
题号:872
//深度优先搜索
var leafSimilar = function (root1, root2) {
let arr1 = [], arr2 = []
let helper = (node, arr) => {
if (node.left == null && node.right == null) {
//叶子节点
arr.push(node)
}
if (node.left) {
helper(node.left, arr)
}
if (node.right) {
helper(node.right, arr)
}
}
helper(root1, arr1)
helper(root2, arr2)
//开始比较
if (arr1.length != arr2.length) {
return false
}
for (let idx = 0; idx < arr1.length; idx++) {
if (arr1[idx].val != arr2[idx].val) {
return false
}
}
return true
};
题号:1720
//异或运算性质
// 相同为0
// 不同为1
// 满足交换律
var decode = function (encoded, first) {
let result = [first]
for (let idx = 0; idx < encoded.length; idx++) {
let num = encoded[idx]
result.push(first ^ encoded[idx])
first = result[result.length - 1]
}
return result
};
题号:1734
var decode = function (encoded) {
//根据题意它是前 n 个正整数的排列
//我们知道n的值
let n = encoded.length + 1
//且我们知道这n个数的异或A^B^C^D^E^F......的值
let num1 = 0
for (let idx = 1; idx <= n; idx++) {
num1 ^= idx
}
//根据题意n是奇数可知encoded的长度为偶数
//假设encoded为[A,B,C,D,E,F]
//我们相隔一个元素取出来进行异或B^D^F
//我们会发现规律隔一个元素取出来异或的结果num2就是我们要求
//的数组的除第一个元素的所有的元素的异或结果
let num2 = 0
for (let idx = 1; idx < encoded.length; idx += 2) {
num2 ^= encoded[idx]
}
//我们要求第一个元素设为X
//X^num2 = num1
//X^num2^num2 = num1^num2
//X = num1^num2
let X = num1 ^ num2
//拿到第一个元素之后此题就转化为1720了
let result = [X], num = X
for (let idx = 0; idx < encoded.length; idx++) {
result.push(encoded[idx] ^ num)
num = result[result.length - 1]
}
return result
};