0ms C Solution. No Wasted Memory.


  • 2
    C

    This will malloc just the right amount of memory. I know it's "just" 1 extra int, but anyway...

    int* plusOne(int* digits, int digitsSize, int* returnSize) {
       int i = (digitsSize) - 1; // start from back
       int* newDigits = NULL;
       
       // if input is 0 don't bother
       if(!digits || digitsSize < 1) return NULL;
       
       while(i  >=  0)
       {
           if(digits[i] == 9)
           {
               digits[i] = 0;
               i--;
               // continue loop because we had to "carry" the 1
           }
           else 
           {
               digits[i] = digits[i] + 1;
               i--;
               break; // stop the while loop because no "carry" needed
           }
       }
       
       if(digits[0] == 0)
       {
           // if first element is 0 then that means it was originally 9 and the 1 "carried".  Need to malloc larger array.
           *returnSize = digitsSize + 1;
           newDigits = (int*)malloc(sizeof(int) * (*returnSize));
           memcpy(newDigits + 1, digits, sizeof(int) * (digitsSize));
           newDigits[0] = 1;
       }
       else
       {
           // first element did not have to increase, so original array size is still valid
           *returnSize = digitsSize;
           newDigits = (int*)malloc(sizeof(int) * (*returnSize));
           memcpy(newDigits, digits, sizeof(int) * (digitsSize));
       }
       return newDigits;
       
    }

  • 0
    L

    What if the input is [0,1,2,3]?


Log in to reply
 

Looks like your connection to LeetCode Discuss was lost, please wait while we try to reconnect.