首页 > 试题广场 >

连续二进制

[编程题]连续二进制
  • 热度指数:792 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
计算一个整数的二进制表示中连续出现1最多的次数。
比如13的二进制是:1101,那么他的二进制表示中连续出现的1最多为2次,所以答案就是2:

输入描述:
一个整数n表示要计算的数字。(1<=n<=1018



输出描述:
输出一个数字表示n的二进制表示中连续出现1最多的次数。
示例1

输入

13

输出

2
var num = parseInt(readline());
// 将数据转换成二进制
const str = num.toString(2);
// 用正则匹配二进制字符串中连续的1出现的情况
const arr = str.match(/1*/ig);

// 判断匹配中的结果
if(arr.length) {
    // 匹配中了多个连续的1,获取长度最长的那个
    print(Math.max(... arr.map(item => item.length)));
} else {
  // 如果数组长度为0,则是没有匹配中连续的1,则查看是否有1出现
    print(str.indexOf("1") >= 0 ? 1 : 0);
}

编辑于 2020-04-27 15:57:31 回复(3)
const readline = require("readline")
 
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})
 
rl.on("line", line => {
  const arr = parseInt(line).toString(2).split("0")
  const result = arr.reduce((prev, cur) => {
    return prev = cur .length > prev ? cur.length : prev
  }, 0)
  console.log(result)
})

发表于 2021-02-24 09:57:44 回复(0)
var a=readline()*1;
let arr=a.toString(2);
let sum=0;
let max=0;
for(var i=0;i<arr.length;i++){
    if(arr[i]==1){
        sum+=1;
    }else{
        max=Math.max(sum,max);
        sum=0;
    }
    }
console.log(Math.max(sum,max))
中规中据的解法
发表于 2020-05-27 13:56:34 回复(0)
function calc(n){
    let arr=n.toString(2).split("0").sort(function(a,b){
        return b.length-a.length
    });
    console.log(arr[0].length)
    return arr[0].length;
}
为什么我这样写不对呀??(小白问号)
发表于 2020-05-10 01:33:50 回复(8)
var num=parseInt(readline());
// 通过 xx.toString(2)转换为二进制
num=num.toString(2);
//因为想匹配到一个数组,所以使用g全局匹配
var reg=newRegExp(/1+/g);
var arr=String(num).match(reg);
var max=0;
arr.forEach((item)=>{
    if(item.length>max){
        max=item.length
    }
})
print(max);
发表于 2020-02-11 23:59:50 回复(2)
function calcL(n) {
  console.log(Math.max(...(Number(n).toString(2).split('0').map(item => item.length))))
}
发表于 2020-10-23 13:16:12 回复(0)
//方法一:正则
let n=parseInt(readline())
function fn(n){
    let str=n.toString(2)
    var reg=new RegExp(/1+/g);
    var arr=str.match(reg);
    arr=Array.from(arr)
    var max=0;
    arr.forEach((item)=>{
        if(item.length>max){
            max=item.length
        }
    })
    return max
}
console.log(fn(n))


//方法二:字符比较
let n=parseInt(readline())
function fn(n){
    let str=n.toString(2)
    let max=0
    let temp=0
    for(let i=0;i<str.length;i++){
        if(str[i]==='1'){
            temp++
            if(temp>max){max=temp}
        }
        if(i>0 && str[i]==='0' && str[i-1]==='1'){
            temp=0
        }
    }
    return max
}
console.log(fn(n))

编辑于 2020-08-27 10:43:10 回复(0)
n = int(input())
s = int(bin(n)[2:])
count = 0
flag = 0
max_count = 0
for i in range(len(bin(n)[2:])):
    if flag == 0 and str(s)[i] == "1":
        count = 1
        flag = 1
    elif flag == 1 and str(s)[i] == "1":
        count += 1
    else:
        flag = 0
    max_count = max(max_count, count)
 
print(max_count)

发表于 2024-05-05 13:21:10 回复(0)
#include <iostream>
using namespace std;

int main() {
    long long int n, count = 0, max=0;
    cin>>n;
    while(n!=0){
        if(n%2==1){
            count++;
            if(count>max)
                max = count;
        } 
        else{
            count=0;
        }
        n/=2;
    }
    cout<<max;
    // return 0;
}

发表于 2024-05-05 10:53:13 回复(0)
#include <iostream>

int maxConsecutiveOnes(long long n) {
    int maxCount = 0;
    int currentCount = 0;

    while (n > 0) {
        if (n % 2 == 1) {
            currentCount++; // 遇到1,当前计数加1
        } else {
            currentCount = 0; // 遇到0,重置当前计数
        }

        if (currentCount > maxCount) {
            maxCount = currentCount; // 更新最大计数
        }

        n >>= 1; // 右移一位,继续检查下一位
    }

    return maxCount;
}

int main() {
    long long num ; // 要计算的整数
    std::cin >> num;
    int result = maxConsecutiveOnes(num);
    std::cout << result << std::endl;

    return 0;
}
发表于 2023-09-14 14:43:12 回复(0)
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLong()){
            long n = scanner.nextLong();
            System.out.println(process(n));
        }
    }

    public static int process(long n){
        int[] bin = getB(n);
        int max = 0;
        int now = 0;
        for (int j : bin) {
            if (j == 1) {
                now++;
                max = Math.max(max, now);
            } else {
                now = 0;
            }
        }
        return max;
    }

    public static int[] getB(long n){
        int[] c = new int[64];
        for (int i = 0; i < 64; i++) {
            c[i] = (n & (1L << i))> 0 ? 1 : 0;
        }
        return c;
    }

先转换为2进制 然后在进行操作

发表于 2023-05-18 21:54:30 回复(0)
      var n = parseInt(readline()).toString(2);  // 将数据转换成二进制
                var n = n.split("0");   // 将字符串分割成字符串
                var shuju = 0;   //用来保存连续1次数的数据
                for (var i = 0; i < n.length; i++) {
                    if (n[i].length > shuju && n[i].indexOf("1") > -1) {
                        shuju = n[i].length;
                    }
                }
                print(shuju) ;

发表于 2021-09-24 09:53:38 回复(0)
var shuru  = Number(readline());
var str = shuru.toString(2);
var arr = str.match(/1+/img);
var max = 0;
for(var i=0;i<arr.length;i++){
    if(arr[i].length>max) max = arr[i].length
}
console.log(max)

发表于 2021-09-17 14:47:53 回复(0)
var n = parseInt(readline())
    n = n.toString(2)
    n = n + ' '
    var count = 1
    var max = 0
    for( var i = 0 ; i<n.length-1 ; i++ ){
        if( n[i] == n[i+1] && n[i] == '1' ){
            count++
        }else{
            if( count > max ){
                max = count
            }
            count = 1
        }
    }
    print(max)
发表于 2020-08-13 11:29:43 回复(0)
我写的这个方法 算不算小动态规划呢?
var a = parseInt(readline());
        fn(a)
        function fn(a) {
            var num = a.toString(2);
            var arr = new Array(num.length);
            if (num[0] == "1") {
                arr[0] = 1;
            } else {
                arr[0] = 0;
            }
            for (var i = 1; i < num.length; i++) {
                if (num[i] == num[i - 1] && num[i] == "1") {
                    arr[i] = arr[i - 1] + 1
                } else {
                    arr[i] = 1
                }
            }
            console.log(Math.max(...arr))
        }


编辑于 2020-07-25 15:37:50 回复(0)
使用位运算解法的思路:
对一个十进制数 n 与 1 进行异或,如果异或的结果为 n - 1,那么说明该十进制数的二进制最低位为 1。否则为 0。计算完后,就将十进制数往右移一位,继续计算连续 1 的长度。
#include <iostream>
(720)#define ll long long
 
using namespace std;
 
int main () {
  ll n;
  int cnt = 0, ans = 0;
 
  cin >> n;
   
  while (n) {
    if ((n ^ 1) == n - 1)
      cnt++;
    else
      cnt = 0;
    ans = max(ans, cnt);
    n >>= 1;
  }
 
  cout << ans << endl;
 
  return 0;
}


发表于 2020-04-04 15:40:15 回复(0)
function max1(num){
    let binaryNum = num.toString(2);
    let max1Num = 0;
    let tempMax = 0;
    for(character of binaryNum.split('')){
        if(character=='1'){
            tempMax += 1;
        }else{
            if(tempMax>max1Num){
                max1Num = tempMax;
            }
            tempMax = 0;
        }
    }
    return max1Num;
}
发表于 2020-04-02 21:48:38 回复(0)
//先通过toString转化为二进制形式的字符串
//然后通过正则匹配所有的连续的1,由于match全局匹配会返回匹配的字符串数组,通过map方法可以得到每个匹配数组的长度,然后reduce得到最大值就可以了

while(line=readline()){
    var lines = line.split(' ');
    var a = parseInt(lines[0]);
   
    print(a.toString(2).match(/1+/g).map((x)=>x.length).reduce((x,y)=> x>y?x:y))
}


编辑于 2020-03-02 13:35:11 回复(0)
	// 不用正则的方法
function maxNum(number){
	    if ( !(1<=number && number<=10^18)){
		     return false
		}
	     let count = 0
	     let icount = 1 // 内部自增的变量
	     let arr = number.toString(2).split('') // 转换成数组
	     for (let i = 0 ;i<arr.length;i++){
	        (parseInt(arr[i])+parseInt(arr[i+1]) == 2)?icount+=1:icount=1
			count<icount?count=icount:count = count
	}
	console.log(count)
	}
	maxNum(65528) // 13

编辑于 2020-02-25 13:36:05 回复(1)
let input;
const reg=/[0]+/g;// 匹配多个0
while(input=readline()){
    let num=parseInt(input.trim());
    let arr=num.toString(2).replace(reg,',').split(','); //将0替换成, 并转成数组
    let max=0
    for(i in arr){
        if(arr[i].length>max){
            max=arr[i].length;
        }
    }
    console.log(max);
}

发表于 2020-02-20 17:17:07 回复(1)