题解 | #牛群的编码II#
牛群的编码II
https://www.nowcoder.com/practice/ed764a3284744317a787ea8218eea880
大家好,我是开车的阿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
阿Q的题解 文章被收录于专栏
阿Q秋招刷过的题
查看14道真题和解析
