題意:
給定兩個字符串形式的非負整數 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;
}