负二进制转换
难度:
标签:
题目描述
代码结果
运行时间: 24 ms, 内存: 0.0 MB
/*
* 思路:
* 使用Java Stream API实现整数 n 转换为负二进制表示。
* 步骤同上:
* 1. 不断地将 n 除以 -2,并记录余数。
* 2. 如果余数为负,则调整余数和商。
* 3. 将所有余数按顺序拼接成字符串,得到最终结果。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public String baseNeg2(int n) {
if (n == 0) return "0";
StringBuilder sb = new StringBuilder();
while (n != 0) {
int remainder = n % -2;
n /= -2;
if (remainder < 0) {
remainder += 2;
n += 1;
}
sb.append(remainder);
}
return sb.reverse().toString();
}
public String baseNeg2Stream(int n) {
return IntStream.iterate(n, i -> i != 0, i -> {
int remainder = i % -2;
i /= -2;
if (remainder < 0) {
remainder += 2;
i += 1;
}
return i;
}).mapToObj(i -> String.valueOf(i % -2 < 0 ? i % -2 + 2 : i % -2))
.collect(Collectors.collectingAndThen(Collectors.joining(), str -> new StringBuilder(str).reverse().toString()));
}
}
解释
方法:
该题解采用的是负二进制的转换方法。算法从整数N开始,通过不断除以-2,并取余数的方式来构建负二进制的表示。这里的关键是处理余数r,因为当余数为负时,需要调整N和余数r以保持余数非负。这是由于在负基数的情况下,标准的除法和余数操作可能生成负的余数。每次迭代中,计算N除以-2的商和余数,如果余数是负的,就调整N(增加1)和r(取其绝对值),以便正确地形成负二进制数。迭代继续直到N变为0。最后,将累积的数字逆序拼接成字符串,以符合从最高位到最低位的顺序。
时间复杂度:
O(log N)
空间复杂度:
O(log N)
代码细节讲解
🦆
为什么在处理余数为负的情况时,需要将N增加1而不是进行其他操作?
▷🦆
当N为0时算法直接返回'0',那么在N为负数时该如何处理?是否需要特别的处理以适应负数输入?
▷🦆
算法中提到每次迭代N都大约缩小到原来的一半,这个描述是否准确?能否给出更精确的描述关于N的变化规律?
▷