当前位置: 面试刷题>> 拥有同样多1的下一个数 (经典算法题500道)


**题目描述补充**: 编写一个函数,该函数接收一个非负整数作为输入,并返回大于该数且二进制表示中1的个数与输入数的二进制表示中1的个数相同的下一个最小整数。如果不存在这样的数,则返回-1。 **示例**: - 输入:`n = 5`(二进制表示为`101`),输出:`9`(二进制表示为`1001`),因为5的二进制表示有2个1,而大于5的下一个数9的二进制表示也有2个1。 - 输入:`n = 7`(二进制表示为`111`),输出:`-1`,因为不存在比7大且二进制中1的个数仍为3的整数。 **PHP 示例代码**: ```php function nextIntegerWithSameNumberOfOnes($n) { $onesCount = substr_count(decbin($n), '1'); $next = $n + 1; while ($next > 0) { $currOnesCount = substr_count(decbin($next), '1'); if ($currOnesCount == $onesCount) { return $next; } $next++; } return -1; } // 测试示例 echo nextIntegerWithSameNumberOfOnes(5); // 输出 9 echo "\n"; echo nextIntegerWithSameNumberOfOnes(7); // 输出 -1 ``` **Python 示例代码**: ```python def nextIntegerWithSameNumberOfOnes(n): def count_ones(num): return bin(num).count('1') ones_count = count_ones(n) next_num = n + 1 while True: if count_ones(next_num) == ones_count: return next_num next_num += 1 if next_num > (1 << 32): # 假设是32位整数,防止无限循环 return -1 # 测试示例 print(nextIntegerWithSameNumberOfOnes(5)) # 输出 9 print(nextIntegerWithSameNumberOfOnes(7)) # 输出 -1 ``` **JavaScript 示例代码**: ```javascript function nextIntegerWithSameNumberOfOnes(n) { function countOnes(num) { let count = 0; while (num) { count += num & 1; num >>= 1; } return count; } let onesCount = countOnes(n); let next = n + 1; while (true) { let currOnesCount = countOnes(next); if (currOnesCount === onesCount) { return next; } next++; } // 理论上JavaScript的Number类型足够大,但为了防止可能的无限循环,可以设置一个上限 // 这里省略了上限设置,因为JavaScript的Number类型溢出会变为Infinity,但实际应用中应谨慎处理 } // 测试示例 console.log(nextIntegerWithSameNumberOfOnes(5)); // 输出 9 console.log(nextIntegerWithSameNumberOfOnes(7)); // 输出 -1(注意:这里的-1需要额外的逻辑处理,因为函数当前设计为返回符合条件的下一个数) ``` 请注意,JavaScript 示例中的函数在达到 JavaScript `Number` 类型的上限时可能不会返回 `-1`,而是会遇到数值溢出的问题。在实际应用中,可能需要添加额外的逻辑来处理这种情况。 **码小课**网站中有更多相关内容分享给大家学习,包括各种算法问题的深入解析和实战演练,欢迎大家访问并交流学习。
推荐面试题