LeetCode - Plus One
Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored such that the most significant digit is at the head of the list.
思路是维护一个进位,对每一位进行加一,然后判断进位,如果有继续到下一位,否则就可以返回了,因为前面不需要计算了。有一个小细节就是如果到了最高位进位仍然存在,那么我们必须重新new一个数组,然后把第一个为赋成1(因为只是加一操作,其余位一定是0,否则不会进最高位)。因为只需要一次扫描,所以算法复杂度是O(n),n是数组的长度。而空间上,一般情况是O(1),但是如果数是全9,那么是最坏情况,需要O(n)的额外空间。
http://www.cnblogs.com/springfor/p/3888002.html
http://www.cnblogs.com/springfor/p/3888002.html
2 for(int i=digits.length-1;i>=0;i--){
3 digits[i] =1+digits[i];
4
5 if(digits[i]==10)
6 digits[i]=0;
7 else
8 return digits;
9 }
10
11 //don't forget over flow case
12 int[] newdigit = new int[digits.length+1];
13 newdigit[0]=1;
14 for(int i=1;i<newdigit.length;i++){
15 newdigit[i] = digits[i-1];
16 }
17 return newdigit;
18 }
public int[] plusOne(int[] digits) {
可以扩展这个到两个数组相加,或者问一些OO设计,假设现在要设计一个BigInteger类,那么需要什么构造函数,然后用什么数据结构好,用数组和链表各有什么优劣势
Read full article from LeetCode - Plus One | Darren's Blog
Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored such that the most significant digit is at the head of the list.
思路是维护一个进位,对每一位进行加一,然后判断进位,如果有继续到下一位,否则就可以返回了,因为前面不需要计算了。有一个小细节就是如果到了最高位进位仍然存在,那么我们必须重新new一个数组,然后把第一个为赋成1(因为只是加一操作,其余位一定是0,否则不会进最高位)。因为只需要一次扫描,所以算法复杂度是O(n),n是数组的长度。而空间上,一般情况是O(1),但是如果数是全9,那么是最坏情况,需要O(n)的额外空间。
http://www.cnblogs.com/springfor/p/3888002.html
先对原数组进行处理。从数组最后一位开始往前检查,如果当前数字是<9的,说明你加1无需进位,从循环跳出即可,如果当前数字等于9,说明加1涉及进位,且加1后当前数字应记为0,继续循环处理。
当对原数组处理完后,还需要判断当前第0位是不是已经变为0了,如果已经变为0了说明是类似99+1这种,需要进位。其他则不需要。
一般对数字进行操作的题都要考虑边界,尤其是溢出问题。
1 public int[] plusOne(int[] digits) {
2 int length;
3 length = digits.length;
4 for(int i = length-1; i>=0; i--){
5 if(digits[i]<9){
6 digits[i]++;
7 break;
8 }else{
9 digits[i]=0;
10 }
11 }
12 // the contract -> always return a new array or we can reuse the existing array(usually it's not a good idea.
13 int[] newdigits;
14 if(digits[0]==0){
15 newdigits = new int[digits.length+1];
16 newdigits[0]=1;
17 for(int i=1;i<newdigits.length;i++){
18 newdigits[i]=digits[i-1];
19 }
20 }else{
21 newdigits = new int[digits.length];
22 for(int i=0;i<digits.length;i++){
23 newdigits[i]=digits[i];
24 }
25 }
26 return newdigits;
27 }
http://blog.welkinlan.com/2015/10/18/plus-one-leetcode-java/2 int length;
3 length = digits.length;
4 for(int i = length-1; i>=0; i--){
5 if(digits[i]<9){
6 digits[i]++;
7 break;
8 }else{
9 digits[i]=0;
10 }
11 }
12 // the contract -> always return a new array or we can reuse the existing array(usually it's not a good idea.
13 int[] newdigits;
14 if(digits[0]==0){
15 newdigits = new int[digits.length+1];
16 newdigits[0]=1;
17 for(int i=1;i<newdigits.length;i++){
18 newdigits[i]=digits[i-1];
19 }
20 }else{
21 newdigits = new int[digits.length];
22 for(int i=0;i<digits.length;i++){
23 newdigits[i]=digits[i];
24 }
25 }
26 return newdigits;
27 }
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class Solution {
public int[] plusOne(int[] digits) {
int c = 1;
int i = digits.length - 1;
for (; i >= 0 && c > 0; i--) {
int d = digits[i] + 1;
digits[i] = d % 10;
c = d / 10; // should exit early
}
if (c > 0) {
digits = new int[digits.length + 1];
digits[0] = 1;
}
return digits;
}
}
|
2 for(int i=digits.length-1;i>=0;i--){
3 digits[i] =1+digits[i];
4
5 if(digits[i]==10)
6 digits[i]=0;
7 else
8 return digits;
9 }
10
11 //don't forget over flow case
12 int[] newdigit = new int[digits.length+1];
13 newdigit[0]=1;
14 for(int i=1;i<newdigit.length;i++){
15 newdigit[i] = digits[i-1];
16 }
17 return newdigit;
18 }
public int[] plusOne(int[] digits) {
if (digits == null)
return null;
// Process the digits in reverse order
for (int i = digits.length-1; i >= 0; i--) {
if (digits[i] < 9) { // Adding 1 ends here
digits[i] += 1;
return digits;
} else { // Add 1 to a higher position
digits[i] = 0;
}
}
// No return from the above; the digits are in the form of 9...9,
// and adding one makes it 10...0
int[] result = new int[digits.length+1]; // should copy data
result[0] = 1;
return result;
}
http://blog.csdn.net/linhuanmars/article/details/22365957可以扩展这个到两个数组相加,或者问一些OO设计,假设现在要设计一个BigInteger类,那么需要什么构造函数,然后用什么数据结构好,用数组和链表各有什么优劣势
Read full article from LeetCode - Plus One | Darren's Blog