821 字符的最短距离 简单

  1. /**
  2. * @param {string} s
  3. * @param {character} c
  4. * @return {number[]}
  5. */
  6. var shortestToChar = function(s, c) {
  7. let res = new Array(s.length), p = -1
  8. for(let i = 0; i < s.length; i++) {
  9. if (c === s[i]) {
  10. p = i
  11. }
  12. if (p !== -1) {
  13. res[i] = Math.abs(i - p)
  14. }
  15. }
  16. p = -1
  17. for(let i = s.length - 1; i >= 0; i--) {
  18. if (c === s[i]) {
  19. p = i
  20. }
  21. if (p != -1) {
  22. if (res[i]) {
  23. res[i] = Math.min(res[i], Math.abs(i - p))
  24. } else {
  25. res[i] = Math.abs(i - p)
  26. }
  27. }
  28. }
  29. return res
  30. };

258 简单

  1. /**
  2. * @param {number} num
  3. * @return {number}
  4. */
  5. var addDigits = function(num) {
  6. let res = num, str = num + ''
  7. while(res > 9) {
  8. res = 0
  9. for(let i = 0; i < str.length; i++) {
  10. res += Number(str[i])
  11. }
  12. str = res + ''
  13. }
  14. return res
  15. };
  1. /**
  2. * @param {number} num
  3. * @return {number}
  4. */
  5. var addDigits = function(num) {
  6. if (num === 0) {
  7. return 0
  8. }
  9. return num % 9 === 0 ? 9 : num % 9
  10. };

1413 简单

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var minStartValue = function(nums) {
  6. let min = 0
  7. nums.reduce((prev, cur) => {
  8. if (prev + cur < 1) {
  9. min = min < prev + cur ? min : prev + cur
  10. }
  11. return prev + cur
  12. }, 0)
  13. return Math.abs(min) + 1
  14. };

39 简单
摩尔投票法

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var majorityElement = function(nums) {
  6. let res = 0, count = 0
  7. for(let i = 0; i < nums.length; i++) {
  8. if (count === 0) {
  9. res = nums[i]
  10. count++
  11. } else {
  12. res === nums[i] ? count++ : count--
  13. }
  14. }
  15. return res
  16. };

面试题02.01 简单

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {ListNode}
  11. */
  12. var removeDuplicateNodes = function(head) {
  13. let start = head
  14. while(start) {
  15. let prev = start, cur = start.next
  16. while(cur) {
  17. if (cur.val === start.val) {
  18. prev.next = cur.next
  19. } else {
  20. prev = cur
  21. }
  22. cur = cur.next
  23. }
  24. start = start.next
  25. }
  26. return head
  27. };

1800. 最大升序子数组和

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var maxAscendingSum = function(nums) {
  6. let max = nums[0], temp = nums[0]
  7. for(let i = 1; i < nums.length; i++) {
  8. if (nums[i] > nums[i - 1]) {
  9. temp += nums[i]
  10. } else {
  11. max = max < temp ? temp : max
  12. temp = nums[i]
  13. }
  14. }
  15. return max < temp ? temp : max
  16. };

575. 分糖果

  1. /**
  2. * @param {number[]} candyType
  3. * @return {number}
  4. * 第一种情况,每个糖果都不相同,[1,2,3,4],妹妹可以分得2种
  5. * 第二种情况,每2个糖果相同,[1,1,2,2],妹妹可以分得2种
  6. * 第三种情况,每个糖果都相同,[1,1,1,1],妹妹可以分得1种
  7. * 所以妹妹可以分得最多种类是,糖果种类 和 糖果个数/2 中的最小值
  8. */
  9. var distributeCandies = function(candyType) {
  10. let type = new Set(candyType).size
  11. return Math.min(type, candyType.length / 2)
  12. };

LCP 02. 分式化简

  1. /**
  2. * @param {number[]} cont
  3. * @return {number[]}
  4. * 1/(a + 1/b) = b / (a * b + 1)
  5. */
  6. var fraction = function(cont) {
  7. let len = cont.length, res = [1, cont[len - 1]]
  8. for(let i = len - 2; i >= 0; i--) {
  9. res = [res[1], cont[i] * res[1] + res[0]]
  10. }
  11. return res.reverse()
  12. };

965. 单值二叉树

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {boolean}
  11. */
  12. var isUnivalTree = function(root) {
  13. if (!root) {
  14. return true
  15. }
  16. if (root.left && root.val !== root.left.val) {
  17. return false
  18. }
  19. if (root.right && root.val !== root.right.val) {
  20. return false
  21. }
  22. return isUnivalTree(root.left) && isUnivalTree(root.right)
  23. };

1619. 删除某些元素后的数组均值

  1. /**
  2. * @param {number[]} arr
  3. * @return {number}
  4. */
  5. var trimMean = function(arr) {
  6. let count = arr.length * 0.05, sum
  7. arr.sort((a, b) => a -b)
  8. arr.splice(0, count)
  9. arr.splice(arr.length - count, count)
  10. sum = arr.reduce((prev, cur) => {
  11. return prev + cur
  12. }, 0)
  13. return sum / arr.length
  14. };

509. 斐波那契数

/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
    if (n < 2) {
        return n
    }
    return fib(n - 1) + fib(n - 2)
};

496. 下一个更大元素 I

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var nextGreaterElement = function(nums1, nums2) {
    for(let i = 0; i < nums1.length; i++) {
        let num = nums1[i], idx = nums2.indexOf(num), flag = false
        for(let j = idx; j < nums2.length - 1; j++) {
            if (nums2[j + 1] > num) {
                nums1[i] = nums2[j + 1]
                flag = true
                break
            }
        }
        if (!flag) {
            nums1[i] = -1
        }
    }
    return nums1
};

122. 买卖股票的最佳时机 II

/**
 * @param {number[]} prices
 * @return {number}
 * 只要今天比昨天的价格高就卖出
 */
var maxProfit = function(prices) {
    let res = 0
    for(let i = 1; i < prices.length; i++) {
        if (prices[i] > prices[i - 1]) {
            res += prices[i] - prices[i - 1]
        }
    }
    return res
};

1332. 删除回文子序列

/**
 * @param {string} s
 * @return {number}
 * 字符串为空返回0,字符串是回文串返回1,否则返回2
 */
var removePalindromeSub = function(s) {
    if (!s.length) {
        return 0
    }
    let flag = true, mid = (s.length >>> 1) + s.length % 2
    for(let i = 0; i < mid; i++) {
        if (s[i] !== s[s.length - i - 1]) {
            flag = false
            break
        }
    }
    return flag ? 1 : 2
};

剑指 Offer 03. 数组中重复的数字

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    for(let i = 0; i < nums.length; i++) {
        if (nums[i] < 0) {
            return i
        }
        if (nums[nums[i]] < 0) {
            return nums[i]
        }
        // 将nums数组中下标为nums[i]的标为负数,如果再遇到负数就说明出现过
        nums[nums[i]] = - nums[nums[i]]
    }
    // -0 < 0 是 false
    return 0
};

257. 二叉树的所有路径

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {string[]}
 */
var binaryTreePaths = function(root) {
    let res = []
    const getPath = (root, path) => {
        if (root) {
            path += root.val
            if (!root.left && !root.right) {
                res.push(path)
            } else {
                path += '->'
                getPath(root.left, path)
                getPath(root.right, path)
            }
        }
    }
    getPath(root, '')
    return res
};

1582. 二进制矩阵中的特殊位置

/**
 * @param {number[][]} mat
 * @return {number}
 */
var numSpecial = function(mat) {
    let res = 0, row = mat.length
    for(let i = 0; i < row; i++) {
        // 如果第i行元素和为1
        if (mat[i].reduce((prev, cur) => prev + cur) === 1) {
            // 找出哪一列为1
            const idx = mat[i].indexOf(1)
            let sum = 0
            // 判断idx列的和是否为1
            mat.map(item => {
                sum += item[idx]
            })
            if (sum === 1) {
                res++
            }
        }
    }
    return res
};

1640. 能否连接形成数组

/**
 * @param {number[]} arr
 * @param {number[][]} pieces
 * @return {boolean}
 */
var canFormArray = function(arr, pieces) {
    for(let i = 0; i < pieces.length; i++) {
        let temp = pieces[i]
        // 如果是多个元素,要判断这些元素在arr中是否相连
        if (temp.length > 1) {
            let idx = arr.indexOf(temp[0])
            if (idx === -1) {
                return false
            }
            for(let j = 1; j < temp.length; j++) {
                if (arr[idx + j] !== temp[j]) {
                    return false
                }
            }
        } else {
            // 如果只有一个,需要判断这个元素在arr中是否存在
            if (!arr.includes(temp[0])) {
                return false
            }
        }
    }
    return true
};

1790. 仅执行一次字符串交换能否使两个字符串相等

/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var areAlmostEqual = function(s1, s2) {
    if (s1.length !== s2.length) {
        return false
    }
    let x1, y1, x2, y2, num = 0
    for(let i = 0; i < s1.length; i++) {
        if(s1[i] !== s2[i]) {
            num++
          // 如果超出2对不相等就返回false
            if (num > 2) {
            return false
        }
          // 记录一下不相等的位置的字符
        if (num === 1) {
            x1 = s1[i]
            x2 = s2[i]
        } else {
            y1 = s1[i]
            y2 = s2[i]
        }
        }
    }
  // 判断交换之后能否相等
    return x1 === y2 && x2 === y1 ? true : false
};