while (i >= 0 || j >= 0 || carry != 0)含义: 字符串 a 和 b 只要有一个没遍历完,那么就继续遍历; 如果字符串 a 和 b 都遍历完了,但是最后留下的进位 carry != 0,那么需要把进位也保留到结果中。 取 digit 的时候,如果字符串 a 和 b 中有一个已经遍历完了(即 i <= 0或者 j <= 0),则认为 a 和 b 的对应位置是 0 。
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
1 2 3 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
1 2 输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
1 2 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ListNode* addTwoNumbers (ListNode* l1, ListNode* l2) { ListNode* head = new ListNode (); ListNode* cur = head; bool OF = false ; while (l1 != nullptr || l2 != nullptr || OF){ int val = 0 ; if (OF)val++; if (l1 != nullptr ){ val += l1->val; l1 = l1->next; } if (l2 != nullptr ){ val += l2->val; l2 = l2->next; } if (val > 9 ){ val -= 10 ; OF = true ; } else OF = false ; cur->next = new ListNode (val); cur = cur->next; } return head->next; }
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1
和 0
。
示例 1:
1 2 输入: a = "11", b = "1" 输出: "100"
示例 2:
1 2 输入: a = "1010", b = "1011" 输出: "10101"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 string addBinary (string a, string b) { int i = (int )a.length () - 1 ,j = (int )b.length () - 1 ; string result; bool OF = false ; while (i >= 0 || j >= 0 || OF){ char val = '0' ; if (OF)val++; if (i >= 0 )val += a[i] - '0' ; if (j >= 0 )val += b[j] - '0' ; i--;j--; if (val > '1' ){ val -= 2 ; OF = true ; } else OF = false ; result = string (1 ,val) + result; } return result; }
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个 数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
1 2 3 输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。
示例 2:
1 2 3 输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vector<int > plusOne (vector<int >& digits) { int i = digits.size () - 1 ; bool OF = true ; vector<int >result; while (i >= 0 || OF){ int val = 0 ; if (OF)val++; if (i >= 0 )val += digits[i--]; if (val > 9 ){ val -= 10 ; OF = true ; } else OF = false ; result.push_back (val); } reverse (result.begin (),result.end ()); return result; }
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
示例 1:
1 2 输入:num1 = "11", num2 = "123" 输出:"134"
示例 2:
1 2 输入:num1 = "456", num2 = "77" 输出:"533"
示例 3:
1 2 输入:num1 = "0", num2 = "0" 输出:"0"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 string addStrings (string num1, string num2) { int i = num1.length () - 1 , j = num2.length () - 1 ; bool OF = false ; string result; while (i >= 0 || j >= 0 || OF){ char val = '0' ; if (OF)val++; if (i >= 0 )val += num1[i] - '0' ; if (j >= 0 )val += num2[j] - '0' ; i--;j--; if (val > '9' ){ OF = true ; val -= 10 ; } else OF = false ; result = string (1 ,val) + result; } return result; }
整数的 数组形式 num
是按照从左到右的顺序表示其数字的数组。
例如,对于 num = 1321
,数组形式是 [1,3,2,1]
。
给定 num
,整数的 数组形式 ,和整数 k
,返回 整数 num + k
的 数组形式 。
示例 1:
1 2 3 输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234
示例 2:
1 2 3 输入:num = [2,7,4], k = 181 输出:[4,5,5] 解释:274 + 181 = 455
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 vector<int > addToArrayForm (vector<int >& num, int k) { int i = num.size () - 1 ; bool OF = false ; vector<int >result; while (i >= 0 || k != 0 || OF){ int val = 0 ; if (OF)val++; if (i >= 0 )val += num[i]; if (k != 0 )val += k%10 ; k /= 10 ;i--; if (val > 9 ){ val -= 10 ; OF = true ; } else OF = false ; result.push_back (val); } reverse (result.begin (),result.end ()); return result; }