leetcode
leetcode 901 ~ 950
负二进制转换

负二进制转换

难度:

标签:

题目描述

代码结果

运行时间: 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而不是进行其他操作?
在使用负二进制表示法中,由于基数是负数(-2),常规的求余操作可能得到负的余数。例如,对于某次迭代中的N值,如果余数r为负,那么直接使用这个负余数会导致结果错误。因此,为了确保每一位的数字非负(0或1),当得到负余数时,我们需要调整N和余数r。将余数r取绝对值后,N需要增加1,这是因为增加1后,N除以-2的结果会补偿由于取绝对值引入的差异,从而维持算法的正确性。这种调整保证了余数始终为0或1,符合负二进制的表示要求。
🦆
当N为0时算法直接返回'0',那么在N为负数时该如何处理?是否需要特别的处理以适应负数输入?
在这个算法中,不论N的初始值是正数、负数还是零,处理逻辑都是一致的。算法通过不断除以-2并处理余数来适应所有整数输入。即使N是负数,算法依然按照同样的方式执行,因为余数和商的调整逻辑(如处理余数为负的情况)能够正确地处理N为负数的情况。因此,不需要对负数输入进行特别的处理,算法本身已经设计成能够自然地处理任何整数(包括负数)。
🦆
算法中提到每次迭代N都大约缩小到原来的一半,这个描述是否准确?能否给出更精确的描述关于N的变化规律?
这个描述不是很准确。由于N每次都是除以-2,实际上N的绝对值在每次迭代后减少至少一半,但由于是除以一个负数,所以N的符号会在每次迭代中交替变化。如果N是正数,那么在除以-2之后,N会变为一个较小的负数;如果N是负数,除以-2后会变为一个较小的正数。这种变化使得N的绝对值逐步减小,直至最终变为0。因此,更准确地描述是:每次迭代后,N的绝对值大约减少一半,而N的符号会交替变化。

相关问题