LeetCode415 字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
简单的一个双指针题目,需要注意的是一开始申请char数组的时候要多申请2位,1位用于可能的进位,1位用于写\0,。
1 class Solution { 2 public: 3 string addStrings(string num1, string num2) { 4 int len1 = num1.size(); 5 int len2 = num2.size(); 6 if (!len1) 7 return num2; 8 if (!len2) 9 return num1; 10 int maxlen = len1 > len2 ? len1 + 1 : len2 + 1; 11 char* ret = new char[maxlen+1]; 12 ret[maxlen] = '\0'; 13 int aim = maxlen - 1; 14 int i = len1 - 1, j = len2 - 1; 15 int carry = 0; 16 while (i >= 0 || j >= 0) { 17 int n1 = i >= 0 ? num1[i] - '0' : 0; 18 int n2 = j >= 0 ? num2[j] - '0' : 0; 19 int sum = n1 + n2 + carry; 20 carry = sum > 9 ? sum / 10 : 0; 21 sum = sum % 10; 22 ret[aim] = sum + '0'; 23 aim--; 24 i--; j--; 25 } 26 if (carry) { 27 ret[aim] = carry+'0'; 28 } 29 else 30 ++ret; 31 string ans(ret); 32 return ans; 33 } 34 };
第二次再看,一个是老是忘记对char型做+'0'或者-'0'来转化成int,而且第一次最后没有释放申请的空间。
1 class Solution { 2 public: 3 string addStrings(string num1, string num2) { 4 int len1=num1.size(); 5 int len2=num2.size(); 6 if(num1.empty()) 7 return num2; 8 if(num2.empty()) 9 return num1; 10 int i=len1-1,j=len2-1; 11 int maxlen=len1>len2?len1+2:len2+2; 12 char* ret= new char[maxlen]; 13 ret[maxlen-1]='\0'; 14 int aim=maxlen-2; 15 int carry=0; 16 while(i>=0 || j>=0){ 17 int n1=i>=0?num1[i]-'0':0; 18 int n2=j>=0?num2[j]-'0':0; 19 int sum=n1+n2+carry; 20 carry=sum>9?sum/10:0; 21 sum%=10; 22 i--;j--; 23 ret[aim]=sum+'0'; 24 aim--; 25 } 26 string ans; 27 if(carry){ 28 ret[0]=carry+'0'; 29 ans=ret; 30 } 31 else 32 ans=ret+1; 33 delete[] ret; 34 return ans; 35 36 } 37 };