大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
- 字符串操作
- 数字的进制转换
- 三进制数的减法
题目解答方法的文字分析
本题要求实现三进制字符串的减法运算。首先将两个三进制编码的字符串转换为等长的字符串,然后逐位进行减法运算,处理借位。最后将得到的三进制编码结果转换为字符串并返回。
具体步骤如下:
- 将字符串
a
的长度扩展到和字符串b
的长度相等,如果a
较短,在高位补零;如果b
较短,在高位补零。 - 初始化一个借位变量
borrow
为0,并创建一个空字符串res
用于存放结果。 - 从右向左逐位进行减法运算,计算
a[i] - b[i] - borrow
的差值,如果差值小于0,则需要借位,并将差值加上3;否则,借位设为0。 - 将每次计算的差值插入到结果字符串
res
的开头。 - 最终得到的字符串
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