每日算法

127 阅读1分钟

每日算法

2373. 矩阵中的局部最大值

给你一个大小为 n x n 的整数矩阵 grid 。

生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal ,并满足:

  • maxLocal[i][j]等于 grid 中以 i + 1 行和 j + 1 列为中心的 3 x 3 矩阵中的 最大值 。

换句话说,我们希望找出 grid 中每个 3 x 3 矩阵中的最大值。返回生成的矩阵。

输入:grid = [[9,9,8,1],[5,6,2,6],[8,2,6,4],[6,2,2,2]] 输出:[[9,9],[8,6]] 解释:原矩阵和生成的矩阵如上图所示。 注意,生成的矩阵中,每个值都对应 grid 中一个相接的 3 x 3 矩阵的最大值。

/**
 * @param {number[][]} grid
 * @return {number[][]}
 */
var largestLocal = function(grid) {
    const n = grid.length;  // 获取二位数组的长度
    // 使用一个n-2 * n-2 的二位数组来存放我们获取的答案,初始化0填充
    const res = new Array(n - 2).fill(0).map(() => new Array(n - 2).fill(0));
    for (let i = 0; i < n - 2; i++) {
        for (let j = 0; j < n - 2; j++) {
            // 以上两个循环遍历的每个3*3的数组的左上角
            for (let x = i; x < i + 3; x++) {
                for (let y = j; y < j + 3; y++) {
                    // 以上两个循环是遍历每个3*3的二维数组
                    res[i][j] = Math.max(res[i][j], grid[x][y]);// 获取每个3*3数组中的最大值,放入我们的答案中。
                }
            }
        }
    }
    return res;
};

largestLocal([[1,1,1,1,1],[1,1,1,1,1],[1,1,2,1,1],[1,1,1,1,1],[1,1,1,1,1]])
//          [Array(3), Array(3), Array(3)]
//          0: (3) [2, 2, 2]
//          1: (3) [2, 2, 2]
//          2: (3) [2, 2, 2]
//          length: 3

面试题 05.02. 二进制数转字符串

​ 二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

/**
 * @param {number} num
 * @return {string}
 */
var printBin = function(num) {
    let result = [];// 用来存放十进制转二进制的数据
    while(num){ // 循环代码
        num = num * 2 
        let i = num >= 1 ? 1 : 0
        result.push(i)
        if(result.length > 32) return 'ERROR'
        num = num - i
        // 十进制转二进制,数据乘2取整数,继续取剩余小数乘2取整数,直到小数为0。
    }
    // 将存储的数据转换成字符串输出
    return `0.${result.join('')}`
};

printBin(0.625)    // "0.101"

1487. 保证文件名唯一

​ 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。

​ 由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新文件夹的文件名添加后缀,其中 k 是能保证文件名唯一的 最小正整数 。

​ 返回长度为 n 的字符串数组,其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。

/**
 * @param {string[]} names
 * @return {string[]}
 */
var getFolderNames = function(names) {
    let set = new Set() // 判断文件名是否存在
    let obj = {} // 保存当前文件名对应的数字
    let NewName = [] // 用来存储答案
    let num = 0 // 记录文件后缀
    for (let i = 0;i<names.length;i++){
        if(set.has(names[i])){ // 存在文件名
            num = obj[names[i]] + 1 || 1 // 获取存在文件名对应的数字
            while(set.has(names[i]+`(${num})`)) num++ // 同名文件后缀递增
            obj[names[i]] = num // 文件对应后缀数字,方便添加同名文件后缀
            NewName.push(`${names[i]}(${num})`) //放入答案
            set.add(`${names[i]}(${num})`) // 更新已存在文件库
        }else{ // 不存在文件名
            NewName.push(`${names[i]}`)//放入答案
            set.add(`${names[i]}`) // 更新已存在文件库
        }
    }
    return NewName //返回答案 
};