【算法通关村】数组加法问题解析

lc66数组加整数一

+1,无非两种情况,不进位返回,进位。

进位有的好说,有的[9,9,9]不好说了。从后向前加的时候,到了A[0]的位置计算为0需要再次进位,但是数组却不能保存了,咋办。

这时java语言好办,因为数组初始化默认为0。因此只用申请一个空间比A[]大1个的数组B[],然后将B[0]设置为1就OK。

 public int[] plusOne(int[] digits) {
         int len=digits.length;
         for(int i=len-1;i>=0;i--){
             digits[i]++;
             digits[i]%=10;
             if(digits[i]!=0){
                 return digits;
             }
         }
         digits = new int[len+1];
         digits[0]=1;
         return digits;
     }

lc989数组加整数

思路一:把整个加数k加入数组表示数的最低位。

 class Solution {
     public List<Integer> addToArrayForm(int[] num, int k) {
         List<Integer> ans = new ArrayList<>();
 ​
         int len = num.length;
         int add=k;
         for(int i=len-1;i>=0;i--){
             int res = num[i]+add;
             ans.add(res%10);
             add = res/10;
         }
         for(;add>0;add/=10){
             ans.add(add%10);
         }
         // if(add!=0){   数组[0] + 1000 结果应该是[1,0,0,0] 而不是[1000,0]
         //     ans.add(add);
         // }
         Collections.reverse(ans);
         return ans;
 ​
     }
 }

思路二:将k拆开,逐位数字相加。

 class Solution {
     public List<Integer> addToArrayForm(int[] num, int k) {
         List<Integer> res = new ArrayList<Integer>();
         int n = num.length;
         for (int i = n - 1; i >= 0; --i) {
             int sum = num[i] + k % 10;
             k /= 10;
             if (sum >= 10) {  //妙,这个进位。
                 k++;
                 sum -= 10;
             }
             res.add(sum);
         }
         for (; k > 0; k /= 10) {
             res.add(k % 10);
         }
         Collections.reverse(res);
         return res;
     }
 }

lc415字符串相加

模拟竖式加法即可。

小问题是,两个数字位数不同怎么处理。简单,补0即可。

注意while条件,三个,不要越界,处理进位。

 class Solution {
     public String addStrings(String num1, String num2) {
         int i=num1.length()-1,j=num2.length()-1,add=0;
         StringBuilder ans = new StringBuilder();
         while(i>=0||j>=0||add!=0){
             int x = i>=0? (num1.charAt(i)-'0'):0; //用0补位
             int y = j>=0? (num2.charAt(j)-'0'):0;
             int res = x+y+add; //计算结果
             ans.append(res%10); //计算此位
             add = res/10; //存进位
             i--;
             j--;
         }
         return ans.reverse().toString();
         
     }
 }

lc67二进制求和

二进制数字是字符串形式,不可以转成int型,可能溢出。

 class Solution {
     public String addBinary(String a, String b) {
         StringBuilder ans = new StringBuilder();
         int i=a.length()-1;
         int j=b.length()-1;
         int add = 0;
         while(i>=0||j>=0||add!=0){
             int x = i>=0? a.charAt(i)-'0':0;
             int y = j>=0? b.charAt(j)-'0':0;
             int sum = x+y+add;
             add = sum>=2? 1:0;
             sum = sum>=2? sum-2:sum;
             ans.append(sum);
             i--;
             j--;
         }
         return ans.reverse().toString();
 ​
     }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值