青训营ai刷题:二进制之和

97 阅读4分钟

题目解析

这个问题要求我们将两个三进制字符串相加,并返回它们的十进制求和结果。由于三进制数字的表示范围是0、1和2,因此我们需要将三进制字符串转换为十进制数字,执行加法运算,然后返回十进制的结果。

解决方案

  1. 理解三进制加法: 三进制是一种基数为3的数字系统。三进制的数字是由数字0、1、2组成的,和我们熟悉的二进制、十进制类似,只不过它是基于3来运算的。

  2. 将三进制字符串转换为十进制: 三进制字符串可以通过类似二进制转换的方法转换为十进制。每一位数字乘以3的对应幂次方,然后将它们加起来。例如,三进制字符串 "120" 对应的十进制数是:

    1 \times 3^2 + 2 \times 3^1 + 0 \times 3^0 = 9 + 6 + 0 = 15

  3. 将结果转换回三进制: 相加后的结果将是十进制数,可以通过常规的十进制转三进制的方法得到。

  4. 优化: 要注意到题目要求 时间复杂度不超过 O(n^2),而由于三进制的加法是直接的(不像我们用进位的方式加法),我们只需通过转换为十进制后直接加法即可,避免了每一位的逐步操作。

步骤

  1. 将两个三进制字符串分别转换为十进制整数。
  2. 对这两个十进制整数执行加法操作。
  3. 将结果转换回三进制表示。

代码实现 public class TernarySum {

// 将三进制字符串转换为十进制整数
public static int ternaryToDecimal(String ternary) {
    int decimal = 0;
    int power = 1;
    
    // 从后往前遍历三进制字符串
    for (int i = ternary.length() - 1; i >= 0; i--) {
        int digit = ternary.charAt(i) - '0'; // 将字符转换为整数
        decimal += digit * power; // 累加
        power *= 3; // 每一位的权重增加
    }
    
    return decimal;
}

// 将十进制整数转换为三进制字符串
public static String decimalToTernary(int decimal) {
    if (decimal == 0) return "0"; // 特殊情况,0的三进制表示为 "0"
    
    StringBuilder ternary = new StringBuilder();
    while (decimal > 0) {
        ternary.insert(0, decimal % 3); // 插入当前余数
        decimal /= 3; // 除以3
    }
    
    return ternary.toString();
}

// 主方法,计算两个三进制字符串的和并返回三进制表示
public static String addTernary(String binary1, String binary2) {
    // 将两个三进制字符串转换为十进制整数
    int num1 = ternaryToDecimal(binary1);
    int num2 = ternaryToDecimal(binary2);
    
    // 执行加法
    int sum = num1 + num2;
    
    // 返回三进制字符串表示的和
    return decimalToTernary(sum);
}

public static void main(String[] args) {

// You can add more test cases here
System.out.println(solution("101", "110"). equals("11"));
System. out. println(solution("111111",
"10100"). equals ("83"));
System. out. println(solution("111010101001001011", "100010101001"). equals ("242420" ));
System. out. println(solution("111010101001011", "10010101001"). equals ("31220" ));

代码解析

  1. ternaryToDecimal 方法:

    • 该方法将三进制字符串转换为十进制数。我们从字符串的末尾开始遍历,每一位乘以相应的3的幂次方,并加到结果中。
  2. decimalToTernary 方法:

    • 该方法将十进制数转换为三进制字符串。通过除以3得到余数并构造结果字符串。余数依次是三进制数字。
  3. addTernary 方法:

    • 该方法负责将两个三进制字符串转换为十进制整数后执行加法,并将结果转换回三进制表示。
  4. main 方法:

    • 用于测试代码的功能,输出两个三进制字符串相加的结果。

时间复杂度分析

  1. 三进制字符串到十进制的转换:这个操作的时间复杂度是 O(n),其中 n 是三进制字符串的长度,因为我们需要逐个字符地处理。

  2. 十进制数转换回三进制字符串:这个操作的时间复杂度也是 O(n),其中 n 是十进制结果的位数,这与输入的三进制字符串长度成比例。

因此,整体时间复杂度是 O(n),符合题目中要求的时间复杂度 O(n^2)(实际上是更优的时间复杂度)

知识总结

  1. 进制转换:通过逐位处理每一位的权重(根据基数)来实现进制转换。二进制、三进制、十进制的转换方法非常相似,只是基数不同。
  2. 时间复杂度分析:我们通过将字符串转换为整数后进行加法运算,这样可以避免直接逐位操作带来的较高复杂度,优化了处理速度。
  3. 实践建议:在处理大数或多进制时,掌握进制转换的技巧非常重要,能帮助我们设计高效的算法。通过这些知识点,你可以更好地理解如何处理进制相关的问题,并将其应用到实际开发中。