精品推荐:
《征服数据结构》专栏:50多种数据结构彻底征服
《经典图论算法》专栏:50多种经典图论算法全部掌握
最近有一位明星挺火的,因为在他的直播间送车,导致很多人到他直播间观看,在线人数已经超过了10万,具体有多少人看过就不知道了,但点赞人数直接超出了 int 的最大值,溢出了,变成了负数 -1669450377 。
我们知道抖音属于字节旗下的,而字节一直以来因为喜欢面试算法难题,被网友调侃为宇宙条。所以这种低级错误实在是不应该犯,解决方式也很简单,一种就是把 int 类型变成 long 类型(C++中可以换成long long),还一种方式就是使用字符串,先不考虑性能的问题,下面我们来看下使用字符串两个数是怎么相加的。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第415题:字符串相加。
问题描述
来源:LeetCode第415题
难度:中等
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例1:
输入:num1 = "11", num2 = "123" 输出:"134"
示例2:
输入:num1 = "456", num2 = "77" 输出:"533"
问题分析
我们知道加法是从个位加起的,我们可以使用两个指针,刚开始的时候两个指针分别指向两个字符串最右边的字符。还要使用一个变量carry来记录进位的值,因为两个数相加最多只能进一位,所以carry要么是 0 要么是 1 。
如果某一位没有数字我们就默认它是 0 ,如下图所示,第一个数字的千位是 2 ,而第二个数字只有两位数,我们就默认它的千位是 0 ,就这样相加。因为是从个位相加,最后还需要把相加的结果进行反转即可。
JAVA:
public String addStrings(String num1, String num2) {
StringBuilder s = new StringBuilder();
int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
while (i >= 0 || j >= 0 || carry != 0) {
int x = i < 0 ? 0 : num1.charAt(i--) - '0';
int y = j < 0 ? 0 : num2.charAt(j--) - '0';
int sum = x + y + carry;
s.append(sum % 10);// 添加到字符串尾部
carry = sum / 10;
}
return s.reverse().toString();//对字符串反转
}
C++:
public:
string addStrings(string num1, string num2) {
string s;
int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
while (i >= 0 || j >= 0 || carry != 0) {
int x = i < 0 ? 0 : num1[i--] - '0';
int y = j < 0 ? 0 : num2[j--] - '0';
int sum = x + y + carry;
s += to_string(sum % 10);// 添加到字符串尾部
carry = sum / 10;
}
reverse(s.begin(), s.end());// 对字符串反转
return s;
}