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(); } }