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

标签: javascript binary


【解决方案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
猜你喜欢
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 2021-06-23
相关资源
最近更新 更多