【LeetCode】一文解决两数相加类问题
时间:2020-05-12
本文章向大家介绍【LeetCode】一文解决两数相加类问题,主要包括【LeetCode】一文解决两数相加类问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
两数相加是一个简单的数学问题,但由于在编程中,数字可以用字符串、数组、链表、二进制等不同的形式进行存储,因此衍生出了各种各样的算法题目,整体相对简单,思想也基本类似,这里进行一个系列整理。
对于两数相加类题目,不论其以何种形式表示,模拟竖式计算的过程都是最简单的思路,从两个数字的低位开始,逐一相加,并计算进位,将进位传递给前一位,依次计算即可,需要特别注意的是在两个数字都加完之后需要考虑最后是否产生了额外的进位。
(一)2、两数相加
本题是将两个加数逆序存储在链表中,参考【LeetCode】2、Add Two Numbers
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<Integer> addToArrayForm(int[] A, int K) {
List<Integer> 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;
}
}
原文地址:https://www.cnblogs.com/gzshan/p/12877796.html
- WCF的Binding模型之四:信道工厂(Channel Factory)
- 如何做一个好的前端重构工程师
- 云计算是否真的对企业来说无所不能?
- 科协带你开个2017年科技世界的总结会!
- 基于StockRanker算法的机器学习量化策略
- Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架
- 交易费用过高的比特币还能成为“未来货币”吗?
- 应用大数据,做好技术成果市场价值评估
- Linux和Windows的换行符
- 行业数据重要性不用多说,呕心整理分享(2)
- 云计算如何在银行业务发挥作用?
- SNH48 要推出定制 AI 形象,和初音未来有什么不同?
- 字节对齐
- 微信更新为小程序引入游戏功能,朋友圈又刷屏了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法