1.将数字变成0的操作次数
题目:给你一个非负整数 num
,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
思路:迭代
/**
* @param {number} num
* @return {number}
*/
var numberOfSteps = function(num) {
let c = 0;
while (num) {
if (num % 2) {
num -= 1;
} else {
num /= 2;
}
c++
}
return c;
};
2.检查整数及其两倍数是否存在
题目:
给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
更正式地,检查是否存在两个下标 i 和 j 满足:
i != j
0 <= i, j < arr.length
arr[i] == 2 * arr[j]
思路:对0单独处理
/**
* @param {number[]} arr
* @return {boolean}
*/
var checkIfExist = function(arr) {
for (const n of arr) {
if (!n && arr.filter((i) => !i).length == 2) {
return true;
} else if (n && arr.includes(2 * n)) {
return true;
}
}
return false;
};
3.统计有序矩阵中的负整数
题目:
给你一个 m * n
的矩阵 grid
,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。
请你统计并返回 grid
中 负数 的数目。
思路:因为是非递增的,所以不需要遍历全部成员,遍历每一行,直到遇到该行第一个负数
/**
* @param {number[][]} grid
* @return {number}
*/
var countNegatives = function(grid) {
let c = 0;
const m = grid.length;
const n = grid[0].length;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] < 0) {
c += n - j;
break;
}
}
}
return c;
};
4.根据数字二进制下1的数目排序
题目:
给你一个整数数组 arr
。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。、
思路:用sort方法,为了提高性能,用缓存
/**
* @param {number[]} arr
* @return {number[]}
*/
var sortByBits = function(arr) {
const map = new Map();
arr.sort((a, b) => {
const l1 = getL(a);
const l2 = getL(b);
if (l1 == l2) return a - b;
return l1 - l2;
});
function getL(a) {
if (map.get(a)) return map.get(a);
const l = a
.toString(2)
.split("")
.filter((i) => i == 1).length;
map.set(a, l);
return l;
}
return arr;
};
5.日期之间隔几天
题目:
请你编写一个程序来计算两个日期之间隔了多少天。
日期以字符串形式给出,格式为 YYYY-MM-DD
,如示例所示。
思路:转换成时间戳计算
/**
* @param {string} date1
* @param {string} date2
* @return {number}
*/
var daysBetweenDates = function(date1, date2) {
const mod = 3600 * 24 * 1000;
return Math.abs((new Date(date1).getTime() - new Date(date2).getTime()) / mod);
};