PU Plus One

Jan 01, 1970

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:

  1. Can I change the origin array? Can I return it?
  2. 3ms, 0.83%

LeetCode: 66. Plus one