【LeetCode】一文解决两数相加类问题
??两数相加是一个简单的数学问题,但由于在编程中,数字可以用字符串、数组、链表、二进制等不同的形式进行存储,因此衍生出了各种各样的算法题目,整体相对简单,思想也基本类似,这里进行一个系列整理。
??对于两数相加类题目,不论其以何种形式表示,模拟竖式计算的过程都是最简单的思路,从两个数字的低位开始,逐一相加,并计算进位,将进位传递给前一位,依次计算即可,需要特别注意的是在两个数字都加完之后需要考虑最后是否产生了额外的进位。
(一)2、两数相加
??本题是将两个加数逆序存储在链表中,参考
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1==null)
return l2;
if(l2==null)
return l1;
ListNode head=new ListNode(-1);
ListNode p=head;
int carry=0;
while(l1!=null || l2!=null){
int x=l1==null?0:l1.val;
int y=l2==null?0:l2.val;
int sum=carry+x+y;
carry=sum/10;
ListNode temp=new ListNode(sum%10);
p.next=temp;
p=p.next;
l1=l1==null?null:l1.next;
l2=l2==null?null:l2.next;
}
if(carry>0){
ListNode temp=new ListNode(carry);
p.next=temp;
}
return head.next;
}
}
(二)66、加一
??给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
输入: [1,2,3]
输出: [1,2,4]
class Solution {
public int[] plusOne(int[] digits) {
int carry=1;
for(int i=digits.length-1;i>=0;i--){
int sum=digits[i]+carry; //低位开始加,每次+1
digits[i]=sum%10;
carry=sum/10;
if(carry==0)
break;
}
if(carry==1){
digits=new int[digits.length+1];
digits[0]=1;
}
return digits;
}
}
(三)67、二进制求和
??给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1
和 0
。
输入: a = "11", b = "1"
输出: "100"
class Solution {
public String addBinary(String a, String b) {
StringBuilder res=new StringBuilder();
int i=a.length()-1,j=b.length()-1;
int carry=0;
while(i>=0||j>=0){
int num1 = i>=0? a.charAt(i)-'0' : 0;
int num2 = j>=0? b.charAt(j)-'0' : 0;
int sum=num1+num2+carry;
//res.insert(0,sum%2);
res.append(sum%2);
carry=sum/2;
i--;
j--;
}
if(carry==1)
//res.insert(0,1);
res.append(1);
return res.reverse().toString();
}
}
(四)415、字符串相加
??给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder res=new StringBuilder();
int i=num1.length()-1,j=num2.length()-1;
int 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 sum=(n1+n2+carry)%10;
carry=(n1+n2+carry)/10;
res.append(sum);
i--;
j--;
}
if(carry!=0)
res.append(carry);
return res.reverse().toString();
}
}
(五)989、数组形式的整数加法
??对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
class Solution {
public List addToArrayForm(int[] A, int K) {
List res=new ArrayList<>();
int i=A.length-1;
int carry=0;
while(i>=0 || K!=0){
int num1= i>=0 ? A[i] : 0;
int num2= K%10;
int sum=num1+num2+carry;
res.add(0,sum%10);
carry=sum/10;
K=K/10;
i--;
}
if(carry!=0)
res.add(0,carry);
return res;
}
}