Carry bit
这题搞懂了才算真正理解carrry bit!!!多练

当前取A[i] 和B[j]相乘,那么结果只有可能影响第i+j和i+j+1位
现在把i+j设成高位,
high = i +j
, i+j+1设成低位,low = i+j+1
product = nnum1[i] * num2[j]
tmp = product + res[i+j+1];
res[i+j+1] = tmp % 10;
res[i+j] = tmp/10 + res[i+j];
最后要找到第一个non-zero number也有点小技巧
if(sb.length() == 0 && i == 0)
这题还要注意"0" * "0"的 corner case
public String multiply(String num1, String num2) { int m = num1.length(), n = num2.length(); int[] res = new int[m + n]; for (int i = m - 1; i>= 0; i--) { for (int j = n - 1; j >= 0; j--) { int product = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); int tmp = product + res[i+j+1]; res[i+j+1] = tmp % 10; res[i+j] = tmp/10 + res[i+j]; } } boolean seen = false; StringBuilder sb = new StringBuilder(); for (int num : res) { if (num == 0 && !seen) continue; sb.append(num); seen = true; } return sb.length() == 0 ? "0" : sb.toString(); }
Add Binary
一开始想到的就是最标准的分情况讨论
首先是末位< 9的话加完就直接返回
然后走一个while loop,只要carry == 0或者i < 0就停止
最后判断carry bit == 1的情况
写出来代码巨长巨丑,只打败2%
public int[] plusOne(int[] digits) {
int carry = 0;
int n = digits.length;
int i = n - 1;
int sum = digits[i] + 1;
if(sum < 10){
digits[i] = sum;
return digits;
}
digits[i] = sum % 10;
carry = sum /10;
i--;
while(i >= 0 && carry == 1){
int add = carry + digits[i];
digits[i] = add % 10;
carry = add /10;
i--;
}
if(carry == 0){
return digits;
}else{
int[] res = new int[n+1];
res[0] = 1;
return res;
}
}
不用说肯定有优化的方法,于是看到了这个巧妙的方法!
直接走一个loop,每次判断当前值digits[i]< 9, 直接
digits[i] ++
后return digits
如果digits[i]>= 9,那么直接digits[i] = 0,妙处就在这里!仔细想想,如果能走到非最低位,肯定说明前一位有进位,所以其实这种情况下就并不是只有最低位plus one,而是可以想象成每一位都plus one!
最后如果是自然跳出了for-loop并且还没return的话只有可能是"999"的情况了,都不需要check if else, 直接看一个新数组
int[] res = new int[n+1]
,res[0] = 1
, thenreturn res
public int[] plusOne(int[] digits) {
int n = digits.length - 1;
for(int i = n; i >= 0; i--) {
if(digits[i] < 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
int[] res = new int[n + 2];
res[0] = 1;
return res;
}
Last updated
Was this helpful?