阅读 139

Leetcode 刷题笔记 - 1

1、利用动态数组解决数据存放问题

编写一段代码,要求输入一个整数N,用动态数组A来存放2~N之间所有5或7的倍数,输出该数组。

示例:

输入:
N = 100 

输出:
5 7 10 14 15 20 21 25 28 30 35 40 42 45 49 50 55 56 60 63 65 70 75 77 80 84 85 90 91 95 98 100
复制代码

题解:

该题利用数组数组结构,打印出 2~N 即可,注意去重和排序。

/**
 * 利用动态数组解决数据存放问题
 * @param {number[]} N
 * @return {number[]}
 */

let dynamicArray = (N) = >{
    if (N < 5) {
        return []
    }
    let A = [] let base = 1
    while (true) {
        if (base * 5 <= N) {
            A.push(base * 5) if (base * 7 <= N) {
                A.push(base * 7)
            }
            base++
        } else {
            break
        }
    }
    let res = Array.from(new Set([...A])) res = res.sort((a, b) = >{
        return a - b
    }) return res
}
复制代码

2、托普利茨矩阵问题

如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。

给定一个M x N的矩阵,当且仅当它是托普利茨矩阵时返回True

示例:

输入:
matrix = [
  [1,2,3,4],
  [5,1,2,3],
  [9,5,1,2]
]


输出: True
复制代码

解释:

在上述矩阵中, 其对角线为: "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。 各条对角线上的所有元素均相同, 因此答案是True

题解:

遍历 matrix[rows.length-1][columns.length-1]判断是否与右下角相同即可。

/**
 * 托普利茨矩阵问题
 * @param {number[][]} matrix
 * @return {boolean}
 */

let isToeplitzMatrix = (matrix) = >{
    for (let i = 0; i < matrix.length - 1; i++) {
        for (let j = 0; j < matrix[i].length - 1; j++) {
            if (matrix[i][j] !== matrix[i + 1][j + 1]) {
                return false
            }
        }
    }
    return true
}
复制代码

3、三数之和

leetcode-cn.com/problems/3s…

给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]
复制代码

题解:

LeetCode 经典题(头条面试必考题),双指针 + 排序

/**
 * 三数之和
 * @param {number[]} nums
 * @return {number[][]}
 */

let threeSum = (nums) = >{
    nums.sort((a, b) = >{
        return a - b
    }) let result = []
    for (let i = 0; i < nums.length; i++) {
        if (i === 0 || nums[i] > nums[i - 1]) {
            let j = i + 1 let k = nums.length - 1
            while (j < k) {
                s = nums[i] + nums[j] + nums[k]
                if (s == 0) {
                    result.push([nums[i], nums[j], nums[k]]) j++;
                    k--;
                    while (j < k && nums[j] == nums[j - 1]) {
                        j++;
                    }
                    while (j < k && nums[k] == nums[k + 1]) {
                        k--;
                    }
                } else if (s > 0) {
                    k--;
                } else {
                    j++;
                }
            }
        }
    }
    return result
}
复制代码
文章分类
前端
文章标签