日常刷题0x7之德玛蹲草丛

134 阅读1分钟

此阶段给自己定的目标是:做过的这些题每天坚持继续刷二遍,每道题做过之后开始尝试多解法尝试解题。上一阶段是感知都有什么题目,此阶段主要系统化常规题解套路知识,牢记牢记此阶段目的。

题号: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
};