大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

  • 字符串操作
  • 数字的进制转换
  • 三进制数的减法

题目解答方法的文字分析

本题要求实现三进制字符串的减法运算。首先将两个三进制编码的字符串转换为等长的字符串,然后逐位进行减法运算,处理借位。最后将得到的三进制编码结果转换为字符串并返回。

具体步骤如下:

  1. 将字符串a的长度扩展到和字符串b的长度相等,如果a较短,在高位补零;如果b较短,在高位补零。
  2. 初始化一个借位变量borrow为0,并创建一个空字符串res用于存放结果。
  3. 从右向左逐位进行减法运算,计算a[i] - b[i] - borrow的差值,如果差值小于0,则需要借位,并将差值加上3;否则,借位设为0。
  4. 将每次计算的差值插入到结果字符串res的开头。
  5. 最终得到的字符串res就是两个三进制编码相减的结果。

本题解析所用的编程语言

C++

完整且正确的编程代码

#include <string>
using namespace std;

class Solution {
public:
    string subtractTernary(string a, string b) {
        // 将字符串 a 的长度扩展到和字符串 b 的长度相等,较短的字符串高位补零
        int diff = b.size() - a.size();
        if (diff > 0) {
            a = string(diff, '0') + a;
        } else {
            b = string(-diff, '0') + b;
        }

        int borrow = 0; // 借位
        string res;
        for (int i = a.size() - 1; i >= 0; --i) {
            int diff = (a[i] - '0') - (b[i] - '0') - borrow;
            if (diff < 0) {
                borrow = 1;
                diff += 3;
            } else {
                borrow = 0;
            }
            res.insert(res.begin(), diff + '0');
        }

        // // 去除结果字符串开头的多余零
        // int leading_zeros = 0;
        // while (leading_zeros < res.size() && res[leading_zeros] == '0') {
        //     leading_zeros++;
        // }
        // res = res.substr(leading_zeros);

        return res.empty() ? "0" : res;
    }
};

样例无需去掉前导0

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!