在JavaScript中查找整数的二进制表示中最长的零序列?

Posted

技术标签:

【中文标题】在JavaScript中查找整数的二进制表示中最长的零序列?【英文标题】:Find longest sequence of zeros in binary representation of an integer in JavaScript? 【发布时间】:2022-01-16 08:55:31 【问题描述】:
    在这个问题中,我必须在整数的二进制表示中找到最长的零序列。 经过大量努力,我能够用我多次更改的逻辑找到最长的零序列。 我的逻辑有一个问题,如果我输入一个没有间隙的整数,我必须给我一个答案 0,我试图自己做出但我失败了。 现在,如果我输入一个没有间隙的整数,它会给我输出无穷大。 当整数的二进制表示中没有间隙时,我希望我的答案打印 0。

var dn = prompt("Enter a number: ");
var bn = new Array();
var i = 0;
var binary = [];

while (dn != 0) 
  bn[i] = dn % 2;
  dn = Math.floor(dn / 2);
  i++;


for (var j = i - 1; j >= 0; j--) 
  binary.push(bn[j]);

console.log(binary.join(""));

var currentGap = 0;
var gaps = [];
var len = binary.length;

for (var k = 0; k < len; k++) 
  if (binary[k] == 0) 
    currentGap++;
    if (binary[k + 1] == 1) 
      gaps.push(currentGap);
      currentGap = 0;
    
  


console.log(Math.max(...gaps));

【问题讨论】:

那么if (gaps.length) console.log(Math.max(...gaps)) else console.log(0)? 【参考方案1】:

您可以使用 0 添加初始化间隙,或者在间隙保持为空时添加条件以打印 0 否则最大间隙。

var dn = prompt("Enter a number: ");
var bn = new Array();
var i = 0;
var binary = [];

while (dn != 0) 
  bn[i] = dn % 2;
  dn = Math.floor(dn / 2);
  i++;


for (var j = i - 1; j >= 0; j--) 
  binary.push(bn[j]);

console.log(binary.join(""));

var currentGap = 0;
//var gaps = []
var gaps = [0];
var len = binary.length;

for (var k = 0; k < len; k++) 
  if (binary[k] == 0) 
    currentGap++;
    if (binary[k + 1] == 1) 
      gaps.push(currentGap);
      currentGap = 0;
    
  

//if (gaps.length === 0)
//  console.log(0)
//else
//  console.log(Math.max(...gaps));
console.log(Math.max(...gaps));

【讨论】:

那是评论,不是答案 如何让它成为答案? 你写了这个作为答案。但这不是一个有效的答案(意思是,不是带有代码和问题解决方案的完整答案)。这只是一个提示。简单的提示应该放在 cmets 中。 @JeremyThille 实际上,它 一个答案,因为它解决了 OP 的问题。是的,解决方案可能很简单,但这是个问题。 aaa 对不起,我没有得到你的观点@Tomᚊturm 你可以复制我的代码然后编辑它然后发布它并用它写下你的观点【参考方案2】:

如果您的 gaps 数组没有长度,您可以简单地打印 0

var dn = prompt("Enter a number: ");
var bn = new Array();
var i = 0;
var binary = [];

while (dn != 0) 
  bn[i] = dn % 2;
  dn = Math.floor(dn / 2);
  i++;


for (var j = i - 1; j >= 0; j--) 
  binary.push(bn[j]);

console.log(binary.join(""));

var currentGap = 0;
var gaps = [];
var len = binary.length;

for (var k = 0; k < len; k++) 
  if (binary[k] == 0) 
    currentGap++;
    if (binary[k + 1] == 1) 
      gaps.push(currentGap);
      currentGap = 0;
    
  


console.log(gaps.length ? Math.max(...gaps) : 0); // <-- This

【讨论】:

谢谢,@jeremythille,对不起,我只是一个自学成才的初学者,所以我很难理解别人的提示 感谢@jeremythille 帮助我【参考方案3】:

如果我误解了您的问题,我深表歉意,但这能解决您的问题吗?

const s = prompt("Enter a number:");
const longest = Math.max(...parseInt(s).toString(2).split('1').map(s=>s.length));

console.log(longest);

【讨论】:

不,没关系,感谢您的回答,但现在作为初学者,我不允许使用许多内置方法@skara9【参考方案4】:

只需更改var gaps = [];var gaps = [0];

你也可以这样做...

let dn = parseInt(prompt("Enter a number: "))

if (isNaN(dn)) console.log('Not a Number!')
else
  
  let
    dnStr = dn.toString(2)  // binary convertion
  , count = 0
  , zVal  = '0'
    ;
  while (dnStr.includes(zVal) ) 
    
    count++
    zVal += '0'
    

  console.log( `$dnStr\n--> $count` )
  

如果您想自己进行二进制转换,最好使用 javascript 二进制运算符:

let dn = parseInt(prompt("Enter a number: "))

if (isNaN(dn)) console.log('Not a Number!')
else
  
  let gap   = [0]
  let Bin   = []
  let count = 0
  for (;;)
    
    Bin.unshift(  dn & 1  )  // --> dn % 2
    if (dn & 1) 
      
      gap.push(count)
      count = 0  
      
    else count++

    dn >>>=1          // --> dn = Math.floor(dn / 2)
    if (!dn) break    // --> if (dn === 0 )
    

  console.log(Bin.join(''))
  console.log(Math.max(...gap))
  

【讨论】:

感谢@misterjojo

以上是关于在JavaScript中查找整数的二进制表示中最长的零序列?的主要内容,如果未能解决你的问题,请参考以下文章

查找堆栈中最长的字符序列

Java题目训练——查找输入整数二进制中1的个数和手套

如何在JavaScript中将数字的二进制表示从字符串转换为整数?

javascript [最长的单词]用于查找句子中最长单词的脚本#vanilla #script

查找“n”个二进制字符串中最长的公共子串的长度

2017年中兴武汉秋招在线编程第二题