每日算法
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 //返回答案
};