求int型正整数在内存中存储时1的个数

321 阅读2分钟

今天分享一道算法题,难度不大,但是里面涉及到的方法值得总结一下。

题目是这样的:

输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。

数据范围:保证在 32 位整型数字范围内

输入描述:

 输入一个整数(int类型)

输出描述:

 这个数转换成2进制后,输出1的个数

第一种思路

  1. 拿到输到的数字,转为2进制
  2. 转为数组进行遍历
  3. 返回符合条件的结果
//假设输入数字为num
let nowNum = parseInt(num,10)
//parseInt(string,radix) 将string按照radix进制进行解析,返回一个整数。radix为2~36之间,否则会返回NAN.
//这里,我们把num按照10进制返回
nowNum = nowNum.toString(2)
//toString(radix)nowNum析的数字的基数(进制数)。
let str = [...nowNum]
//转数组
let count = 0
//计数
str.forEach(e=>e == '1' ? count++ : '' )
console.log(count)

另一种方法,思路一样,采取的方法不同:

console.log(parseInt(num,10).toString(2).spilt('').filter(e=>e == '1').length)

这里一样的思路,采用的js方法不同,进制转换完后,这里是利用spilt()对字符串进行分割; 同时利用filter()将符合条件的数组返回求其长度。

当然这里也可以用其他方法来找出“1”的个数,比如正则:match(/1/g)

filter()  方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

第二种思路

二进制逢二进一,将num进行对2取余,每次等于1的时候,计数+1,计数后,num变为一边向下取整的数,继续走循环。

let num =parseInt(readline(),10);
let i=0;
while(num>0){
  if(num%2){
      i++;
  }
  num=Math.floor(num/2);
}
console.log(i);