今天分享一道算法题,难度不大,但是里面涉及到的方法值得总结一下。
题目是这样的:
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
数据范围:保证在 32 位整型数字范围内
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
第一种思路
- 拿到输到的数字,转为2进制
- 转为数组进行遍历
- 返回符合条件的结果
//假设输入数字为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);