前言
本题主要考查 字符串 的模拟。
提示:以下是本篇文章正文内容,编程语言为Java
一、题目描述
给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
链接:字符串相加
二、解题思路
本题我们只需要对两个整数模拟 竖式加法 的过程。小学常用的算数技巧:把两个数的位置对齐,从低位依次相加,产生进位则向高位进一位。为了编程方便,我们可以给位数较少的补零,保证两个数的位数相同,便于计算。
三、示例代码
class Solution {
public String addStrings(String num1, String num2) {
int l1=num1.length()-1;
int l2=num2.length()-1;
int add=0;
StringBuffer ans=new StringBuffer();
while(l1>=0 || l2>=0 || add!=0){
int x= l1>=0?num1.charAt(l1)-'0':0;
int y= l2>=0?num2.charAt(l2)-'0':0;
int result=x+y+add;
ans.insert(0,result%10);
add=result/10;
l1--;
l2--;
}
return ans.toString();
}
}
总结
前面总结了 StringBuilder
的用法。今天,这道题我们使用了另一个可变字符串的类 StringBuffer
,其常用的方法和 StringBuilder
是一样的,下面重点说一下它们的不同之处:
1. 线程安全。StringBuffer
是线程安全的,而 StringBuilder
线程不安全。因为 StringBuffer
的所有公开方法都是 synchronized
修饰的,而 StringBuilder
并没有 synchronized
修饰。
2. 缓冲区。
1)StringBuffer 代码片段:
private transient char[] toStringCache;
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
2)StringBuilder 代码片段:
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
从上面可以看出,StringBuffer
每次获取 toString
都会直接使用缓存区的 toStringCache
值来构造一个字符串。而 StringBuilder
则每次都需要复制一次字符数组,再构造一个字符串。
3. 性能。
StringBuffer
是线程安全的,它的所有公开方法都是同步的,StringBuilder
是没有对方法加锁同步的,所以 StringBuilder
的性能要优于 StringBuffer
。
参考博客:StringBuffer 和 StringBuilder 的 3 个区别