一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
前言
今天的题目为简单,今天的题目虽然是简单题,但是涉及到了一个编程的重要思想,就是分而治之,遇到一个比较难的问题的时候,我们需要将它做一个拆分,分成若干个简单的处理,在js中就是一个个函数,每个函数做自己的工作,然后最后我们在做一个拼接,以此达到目的。
每日一题
今天的题目是 762. 二进制表示中质数个计算置位,难度为简单
给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数。
计算置位位数 就是二进制表示中 1 的个数。
例如, 21 的二进制表示 10101 有 3 个计算置位。
示例 1:
输入:left = 6, right = 10
输出:4
解释:
6 -> 110 (2 个计算置位,2 是质数)
7 -> 111 (3 个计算置位,3 是质数)
9 -> 1001 (2 个计算置位,2 是质数)
10-> 1010 (2 个计算置位,2 是质数)
共计 4 个计算置位为质数的数字。
示例 2:
输入:left = 10, right = 15
输出:5
解释:
10 -> 1010 (2 个计算置位, 2 是质数)
11 -> 1011 (3 个计算置位, 3 是质数)
12 -> 1100 (2 个计算置位, 2 是质数)
13 -> 1101 (3 个计算置位, 3 是质数)
14 -> 1110 (3 个计算置位, 3 是质数)
15 -> 1111 (4 个计算置位, 4 不是质数)
共计 5 个计算置位为质数的数字。
提示:
- 1 <= left <= right <= 106
- 0 <= right - left <= 104
题解
暴力解法
首先按照题目的要求,我们要去求得一个范围里面每个数它的二进制中,一的个数是不是质数,那么我们可以把这个问题分为两个小问题,第一个是,如何去求得一个数的二进制中会有几个1,在一个就是怎么去判断一个是是不是质数,只要解决了这两个问题,那么就能够解决题目的要求。
二进制中 1 的个数
首先 js 是由提供给我们将一个数转化为二进制的方法的,就是 toStrin(2) 可以将一个数字转为二进制并且会转为字符串,那么在我们得到二进制字符串之后,就好办了,直接去除掉字符串中的0,然后求得剩下的1的长度,就是二进制中1的个数了
function oneNumber(i) {
return i.toString(2).split("0").join("").length;
}
判断一个数是否是质数(素数)
首先小于 2 的数一定不是质数,直接返回false,然后就是去写一个循环,能够被除了本身和1整除的数,就不是质数
function isPrime(number) {
if (number < 2) return false;
var isPrime = true;
for (var i = 2; i < number; i++) {
if (number % i === 0) {
isPrime = false;
break;
}
}
return isPrime;
}
解题
再知道上面两个方法之后,题目就简单了。我们只需要循环题目给的left到right,然后把每一个数都去判断二进制1的个数是不是质数。最后把得到的结果相加返回。就是题目需要的结果了
/**
* @param {number} left
* @param {number} right
* @return {number}
*/
var countPrimeSetBits = function (left, right) {
let res = 0;
for (let i = left; i <= right; i++) {
if (isPrime(oneNumber(i))) {
res++;
}
}
return res;
};
function isPrime(number) {
if (number < 2) return false;
var isPrime = true;
for (var i = 2; i < number; i++) {
if (number % i === 0) {
isPrime = false;
break;
}
}
return isPrime;
}
function oneNumber(i) {
return i.toString(2).split("0").join("").length;
}