楼主: sicilianee
跳转到指定楼层
上一主题 下一主题
收起左侧

记录

🔗
 楼主| sicilianee 2017-10-5 13:43:48 | 只看该作者
全局:
Make up

0810 2. Binary Tree Level Order Traversal

/**
* Definition for a binary tree node.
* function TreeNode(val) {
*     this.val = val;
*     this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrder = function(root) {
    if (root == null) {return []}
    const queue = [root];
    const res = [];
    while (queue.length > 0) {
        const len = queue.length;
        const level = [];
        for (let i = 0; i < len; i++) {
            const node = queue.shift();
            level.push(node.val);
            if (node.left != null) {queue.push(node.left)}
            if (node.right != null) {queue.push(node.right)}
        }
        res.push(level);
    }
    return res;
};
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-6 13:11:56 | 只看该作者
全局:
1005 1. Power of Three

/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfThree = function(n) {
    while (n >= 3) {
        n = n / 3;
    }
    return n === 1;
};

TODO:
The follow up is worth thinking about. They have a solution. Read it.
Need to think about floating point and precision in js.
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-6 13:18:55 | 只看该作者
全局:
1005 2. Set Mismatch

/**
* @param {number[]} nums
* @return {number[]}
*/
var findErrorNums = function(nums) {
    const map = new Map();
    nums.forEach(num => {
        const count = map.has(num) ? map.get(num) + 1 : 1;
        map.set(num, count);
    });
    let a;
    let b;
    for (let i = 1; i <= nums.length; i++) {
        if (!map.has(i)) {
            b = i;
        } else if (map.get(i) === 2) {
            a = i;
        }
    }
    return [a, b];
};
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-6 14:32:40 | 只看该作者
全局:
sicilianee 发表于 2017-10-6 13:18
1005 2. Set Mismatch

/**

/**
* @param {number[]} nums
* @return {number[]}
*/
var findErrorNums = function(nums) {
    let xor = nums.reduce((prev, curr) => prev ^ curr);
    for (let i = 1; i <= nums.length; i++) {
        xor ^= i;
    }
    const rightMostBit = xor & ~(xor - 1);
    let xor0 = 0;
    let xor1 = 0;
    nums.forEach(num => {
        if ((rightMostBit & num) === 0) { // !!!!!!!!!!!!!! shit again !!!!!!!!!!!!!!!!! BITWISE PRECEDENCE
            xor0 ^= num;
        } else {
            xor1 ^= num;
        }
    });
    for (let i = 1; i <= nums.length; i++) {
        if ((rightMostBit & i) === 0) {
            xor0 ^= i;
        } else {
            xor1 ^= i;
        }
    }
    if (nums.includes(xor0)) {
        return [xor0, xor1];
    } else {
        return [xor1, xor0];
    }
};
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-6 14:34:40 | 只看该作者
全局:
sicilianee 发表于 2017-10-6 14:32
/**
* @param {number[]} nums
* @return {number[]}

So an array using o(n) space
- reduce to o(1) space: usually operate on the same array with negative or alike
- reduce to o(1) space without modifying original array, usually using bitwise manipulations. Either ^ or alike or using 32 bit character.
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-7 14:13:48 | 只看该作者
全局:
1006 1. Contiguous Array

/**
* @param {number[]} nums
* @return {number}
*/
var findMaxLength = function(nums) {
    if (nums == null || nums.length === 0) {
        return 0;
    }
    let count = 0;
    let max = 0;
    const map = new Map([[0, -1]]);
    for (let i = 0; i < nums.length; i++) {
        const value = nums[i] === 1 ? 1 : -1;
        count += value;
        if (map.has(count)) {
            max = Math.max(max, i - map.get(count));
        } else {
            map.set(count, i);
        }
    }
    return max;
};
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-7 14:46:03 | 只看该作者
全局:
1006 2.  Subarray Sum Equals K

/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var subarraySum = function(nums, k) {
    if (nums == null) {return 0;}
    let sum = 0;
    let count = 0;
    const map = new Map([[0, 1]]); // !!! target sum, and count, this is what we store !!!
    for (let i = 0; i < nums.length; i++) {
        sum += nums[i];
        const target = sum - k;
        if (map.has(target)) {
            count += map.get(target);
        }
        const value = map.has(sum) ? map.get(sum) + 1 : 1;
        map.set(sum, value);
    }
    // if (k === 0) {count++;}   they don't count empty array as count is zero, or as subarray
    return count;
};
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-9 08:56:28 | 只看该作者
全局:
1007 1. Power of Two

/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
    if (n <= 0) {return false;} // !!! could even be negative
    return n === (n & (~(n - 1)));
};
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-9 09:03:03 | 只看该作者
全局:
1007 2. Climbing Stairs

/**
* @param {number} n
* @return {number}
*/
var climbStairs = function(n) {
    if (n <= 0) {return 0;}
    const dp = Array(n + 1).fill(0);
    dp[0] = 1; // !!!! because we need to use it
    dp[1] = 1;
    for (let i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
};
回复

使用道具 举报

🔗
 楼主| sicilianee 2017-10-9 09:22:26 | 只看该作者
全局:
1008 1. Find Minimum in Rotated Sorted Array

/**
* @param {number[]} nums
* @return {number}
*/
var findMin = function(nums) {
    if (nums == null || nums.length === 0) {
        return null;
    }
    let start = 0;
    let end = nums.length - 1;
    if (nums[start] < nums[end]) { // !!!! this situation does happen!!!!
        return nums[start];
    }
    while (start < end) {
        let mid = Math.floor((start + end) / 2);
        if (nums[mid] > nums[start]) {
            start = mid;
        } else if (nums[mid] < nums[start]) {
            end = mid;
        } else {
            start++;   // this is also very important, midVal === starVal, we increase start
        }
    }
    return nums[start];
};
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表