【问题标题】:Optimize getting all sub-strings of a binary string优化获取二进制字符串的所有子字符串
【发布时间】:2019-12-08 21:15:31
【问题描述】:

代码是将十进制数转换为二进制,生成二进制字符串所有可能的子串,并计算每个子串中0和1的奇数个,最后返回总计数。运行此代码会在hackerrank 等网站中出现超时错误。应该使用什么方法来降低这里的复杂性?我尝试将所有二进制数推入一个数组,然后分别对其进行迭代以避免0(n ^ 3)。但即使这样似乎也行不通。这里应该采用动态规划方法吗?

    function getAllSubstrings(str) {
  let result = [];
  let n = str.length
  let oddZeroCnt = 0;
  let oddOneCnt = 0;
  for (let i = 0; i < n; i++)
    for (let j = i + 1; j <= n; j++) {
      let substr = str.substring(i, j);
      let zeroSubStr = (substr.split("0").length - 1)
      let oneSubStr = (substr.split("1").length - 1)
      if (zeroSubStr % 2 === 1) {
        oddZeroCnt++
      }
      if (oneSubStr % 2 === 1) {
        oddOneCnt++
      }
    }
  return oddZeroCnt + " " + oddOneCnt;
}

function getOddCounts(decNum) {
  return getAllSubstrings((decNum >> BigInt(0)).toString(2))
}
let input = BigInt(17)
console.log(getOddCounts(input))

【问题讨论】:

    标签: javascript string binary substring bit


    【解决方案1】:

    (1) 你不需要字符串。您可以使用number &amp; (1 &lt;&lt; position)检查数字位置是否设置了位。

    (2) 您不需要计算偶数的赔率。每个非奇数都是偶数,因此total = even + odd。如果知道组合的总数和奇数的个数,就可以很容易地计算出偶数。

    (3) 你只需要迭代两次 (O(n²))。如果你看看这些 17 位的组合,从 0 开始:

      1     ≠> odd
      10    => odd
      100   => odd
      1000  => odd
      10001 ≠> even
    

    然后您可以看到组合是偶数,直到出现 1,然后它们是奇数,直到出现另一个 1。如果您跟踪上一个组合是偶数还是奇数,您可以通过查看当前位轻松确定下一个组合是否奇数:

      let odd = false, odds = 0;
    
      /*...*/
         if(number & (1 << position)) odd = !odd;
         if(odd)  odds += 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2012-09-14
      • 1970-01-01
      • 2015-09-18
      • 2021-12-01
      • 2011-07-11
      • 1970-01-01
      相关资源
      最近更新 更多