给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

①num1 和num2 的长度都小于 5100.
②num1 和num2 都只包含数字 0-9.
③num1 和num2 都不包含任何前导零。
④你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

结题思路:

首先,String类型只有运算符重载的‘+’   ,用于拼接字符串的简化操作, 不支持常规的四则运算

但是Char类型可以进行加减乘除的运算,可以想到将String中的每个字符转换为char类型进行计算

算法流程:

  首先确定num1与num2的长度L,因为③num1 和num2 都不包含任何前导零,题目明显暗示我们短的字符串需要前导补0

  需要两个变量,temp来储存 num1与num2 的char值相加的结果 ,res来储存是否有进位,进位则加一

  结果需要存回字符串,由于先从末位开始计算,存进去的字符串需要逆序。

public String addStrings(String num1, String num2) {
int L = num1.length() >= num2.length() ? num1.length() : num2.length();
String s="";
if (num1.length()<L) {
for (int i=0;i<L-num1.length();i++)
s = s + '0';
num1 = s+num1;
}
if (num2.length()<L) {
for (int i=0;i<L-num2.length();i++)
s = s + '0';
num2 = s+num2;
}
StringBuffer save = new StringBuffer();
boolean res = false;
for (int i = L - 1; i >= 0; i--) {
int n1 = num1.charAt(i)-'0';
int n2 = num2.charAt(i)-'0';
int temp = res?n1+n2+1:n1+n2;
if (temp>=10) {
res=true;
}else res=false;
save.append(temp%10);
}
if (res) save.append(1);
return save.reverse().toString();
}

耗时很长,参考了一下Krahets的解法,思路是一致的,使用双指针进行解答

    public String addStrings(String num1, String num2) {
StringBuilder res = new StringBuilder("");
int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
while(i >= 0 || j >= 0){
int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
int tmp = n1 + n2 + carry;
carry = tmp / 10;
res.append(tmp % 10);
i--; j--;
}
if(carry == 1) res.append(1);
return res.reverse().toString();
}

Leetcode_415字符串相加的更多相关文章

  1. T-SQL字符串相加之后被截断的那点事

    本文出处:http://www.cnblogs.com/wy123/p/6217772.html 字符串自身相加, 虽然赋值给了varchar(max)类型的变量,在某些特殊情况下仍然会被“截断”,这 ...

  2. C语言关于利用sscanf实现字符串相加减

    #include<stdio.h>#include<string.h>void main(){ int a; int b; char str1[10] = "9999 ...

  3. 【转】String字符串相加的问题

    String字符串相加的问题 前几天同事跟我说我之前写的代码中在操作字符串时候,使用字符串相加的方式而不是使用StringBuffer或者StringBuilder导致内存开销很大.这个问题一直在困扰 ...

  4. String 字符串相加比较

    String 字符串相加 对比 public static void main(String[] args) { String a = "helloword"; final Str ...

  5. 代码题(59)— 字符串相加、字符串相乘、打印最大n位数

    1.415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 思路:和链表相加类似,求进位. class Solution { public: string addS ...

  6. LeetCode:字符串相加【415】

    LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...

  7. String字符串相加的原理

    因为String是非常常用的类, jvm对其进行了优化, jdk7之前jvm维护了很多的字符串常量在方法去的常量池中, jdk后常量池迁移到了堆中 方法区是一个运行时JVM管理的内存区域,是一个线程共 ...

  8. Java实现 LeetCode 415 字符串相加

    415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num ...

  9. [LeetCode]415. 字符串相加、43. 字符串相乘

    题目 415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 题解 维护一个temp表示当前两数相加+上一个进位的和. 每次更新结果的一位. 注意终止条件. 最后将 ...

随机推荐

  1. PAT_A1077#Kuchiguse

    Source: PAT A1077 Kuchiguse (20 分) Description: The Japanese language is notorious for its sentence ...

  2. 存取cookies

    保存: Response.Cookies["OpenID"].Value = wxobj.openid; Response.Cookies["NickName" ...

  3. 关于array_merge()的注意

    array_merge() 函数把两个或多个数组合并为一个数组. 1 如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的). 2 如果数组是数字索引的,则键名会以连续方式重新索引. 2 ...

  4. ==和equal的区别

    1.“==”运算符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符. 如果一个变量指向的数据是对 ...

  5. 55.Top K Frequent Elements(出现次数最多的k个元素)

    Level:   Medium 题目描述: Given a non-empty array of integers, return the k most frequent elements. Exam ...

  6. SQLRecoverableException: I/O Exception: Connection reset

    https://stackoverflow.com/questions/6110395/sqlrecoverableexception-i-o-exception-connection-reset T ...

  7. Codeforces 356D 倍增优化背包

    题目链接:http://codeforces.com/contest/356/problem/D 思路(官方题解):http://codeforces.com/blog/entry/9210 此题需要 ...

  8. python3 线程调用与GIL 锁机制

    转载

  9. MariaDB 删除表

    在本章中,我们将学习删除表. 表删除很容易,但记住所有删除的表是不可恢复的. 表删除的一般语法如下 - DROP TABLE table_name ; 存在执行表删除的两个选项:使用命令提示符或PHP ...

  10. 每天一个linux命令:cp(8)

    cp cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时, ...