题意:
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:"
134"
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
提示:
1 <= num1.length, num2.length <= 10^4
num1
和num2
都只包含数字0-9
num1
和num2
都不包含任何前导零
题目来源: https://leetcode.cn/problems/add-strings/description/
解题方法:
方法一:长度以0补齐,从个位开始相加(从后往前),判断是否进一
// 长度以0补齐,从个位开始相加,判断是否进一
function addStrings($num1, $num2) {$strLen1 = strlen($num1);$strLen2 = strlen($num2);// 找到长的字符串的长度,用于循环$strlen = $strLen1 >= $strLen2 ? $strLen1 : $strLen2;// 短的字符串前补0if($strLen1 > $strLen2){$num2 = str_repeat("0", $strLen1 - $strLen2) . $num2;}else{$num1 = str_repeat("0", $strLen2 - $strLen1) . $num1;}$result = ""; //结果$is_add_one = 0; //两者相加是否大于等于10,来判断是否进行加一for($i = $strlen - 1; $i >= 0; $i--){if(($num1[$i] + $num2[$i] + $is_add_one) >= 10){ //如果大于等于10,取个位进一$result = strval($num1[$i] + $num2[$i] + $is_add_one)[1] . $result;$is_add_one = 1;if($i == 0){$result = "1" . $result; //循环到最大位时前补一}}else{ //小于10时,相加即可$result = strval($num1[$i] + $num2[$i] + $is_add_one) . $result;$is_add_one = 0;}}return $result;
}
方法二: 从后向前,对应的位置的数字相加,如果结果大于 9,需要进位
难点: 1.难点进位处理 2.最高位进位处理
此方法参考:
作者:Zou Zhipeng
链接:https://leetcode.cn/problems/add-strings/solutions/202746/php-jie-fa-by-zzpwestlife-51/
来源:力扣(LeetCode)
// 从后向前,对应的位置的数字相加,如果结果大于 9,需要进位
// 1.难点进位处理 2.最高位进位处理
function addStrings($num1, $num2) {$len1 = strlen($num1);$len2 = strlen($num2);if($len1 == 0) return $num2;if($len2 == 0) return $num1;// 从最低位开始处理$i = $len1 - 1;$j = $len2 - 1;// 进位标记$carry = 0;$return = '';// 使用该判断条件,一次遍历处理完所有情况while ($i >= 0 || $j >= 0 || $carry){$sum = $carry;if($i >= 0){$sum += substr($num1, $i, 1);$i--;}if($j >= 0){$sum += substr($num2, $j, 1);$j--;}// 进位处理$carry = floor($sum / 10);$return = $sum % 10 . $return;}return $return;
}