https://leetcode-cn.com/problems/add-strings/

顺便复习一下String StringBuffer StringBuilder
StringBuilder是线程不安全的,虽然比StringBuffer快一点点,但是却要冒着线程不安全的风险

3,使用策略:(1)基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。

(2)不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。例如:

(3)为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能。

(4)StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。

(5)相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer

思路:双指针,模拟

  • 定义双指针 i、j,分别指向 num1,num2 末尾;
  • 定义变量 carry,用以存储进位;
  • 开始模拟计算(注意要加上进位),循环条件为3种,i>=0||j>=0||carray!=0
    • 当指针i,j没有移动到开头时,都需要进行计算,即使i,j都移动到开头了,但是index为0存在进位的情况,也需要继续计算
  • 因为 num1 和 num2 的长度可能不等,那么就有可能出现索引溢出的情况。每次进行carray+=num1.charAt(i)计算时,判断i是否大于等于0,j同理
  • carray模10得到的即为结果放入ans.append中,carray=carray/10进行更新进位,循环至结束
  • 最后需要对ans进行翻转
    1. class Solution {
    2. public String addStrings(String num1, String num2) {
    3. //1.定义两个指针
    4. int i = num1.length() - 1;
    5. int j = num2.length() - 1;
    6. //定义进位
    7. int carray = 0;
    8. StringBuffer ans = new StringBuffer();
    9. while(i>=0||j>=0||carray!=0){
    10. if(i>=0){
    11. carray += num1.charAt(i) - '0';
    12. i--;
    13. }
    14. if(j>=0){
    15. carray += num2.charAt(j) - '0';
    16. j--;
    17. }
    18. ans.append(carray%10);
    19. carray = carray/10;
    20. }
    21. return ans.reverse().toString();
    22. }
    23. }