leetcode刷题记录-762. 二进制表示中质数个计算置位

138 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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;
}

image.png