Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.
You may assume the integer do not contain any leading zero, except the number 0 itself.
The digits are stored such that the most significant digit is at the head of the list.
C Solution 1:
int* plusOne(int* digits, int digitsSize, int* returnSize) {
int i, carry = 0;
digits[digitsSize - 1]++;
for (i = digitsSize - 1; i > -1; i--) {
if (digits[i] + carry > 9) {
digits[i] += carry - 10;
carry = 1;
}
else {
digits[i] += carry;
carry = 0;
}
}
int *res = malloc((digitsSize + 1) * sizeof(int));
if (carry) {
res[0] = 1;
memcpy(res + 1, digits, digitsSize * sizeof(int));
*returnSize = digitsSize + 1;
return res;
}
memcpy(res, digits, digitsSize * sizeof(int));
*returnSize = digitsSize;
return res;
}
C Solution 2:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize) {
int *res = malloc((digitsSize + 1) * sizeof(int));
int i;
for (i = digitsSize - 1; i > -1 && digits[i] == 9; i--) {
res[i + 1] = 0;
}
if (i == -1) {
res[0] = 1;
*returnSize = digitsSize + 1;
return res;
}
int j;
for (j = 0; j < i; j++) res[j] = digits[j];
res[j] = digits[j] + 1;
for (j++; j < digitsSize; j++) res[j] = 0;
*returnSize = digitsSize;
return res;
}
C Solution 3:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize) {
int *res = malloc((digitsSize + 1) * sizeof(int));
int i;
for (i = digitsSize - 1; i > -1 && digits[i] == 9; i--) {
res[i + 1] = 0;
}
if (i == -1) {
res[0] = 1;
*returnSize = digitsSize + 1;
return res;
}
memcpy(res, digits, (i + 1) * sizeof(int));
res[i]++;
memset(res + i + 1, 0, (digitsSize - i - 1) * sizeof(int));
*returnSize = digitsSize;
return res;
}
Summary:
- Can I change the origin array? Can I return it?
- 3ms, 0.83%
LeetCode: 66. Plus one





近期评论