banner
ekko

ekko's blog

时间不在于你拥有多少,而在于你怎样使用
github
xbox
email

加一

描述#

給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。

最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。

你可以假設除了整數 0 之外,這個整數不會以零開頭。

示例 1:

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。

示例 2:

輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。

思路#

  • 不同數組操作主要分為最後一位為 9 的和不為 9 的,若最後一位不為 9,則最後一位加一輸出即可
  • 若最後一位為 9,又可分為全為 9 和不全為 9,全為 9 時數組大小加一,且除第一位為 1 外其他全為 0
  • 不全為 9 時,從後往前遍歷數組,若為 9 則置為 0,若不為 9 則加一直接返回
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int* digits, int digitsSize, int* returnSize){
    int* result;
    //最後一位不是9
    if(digits[digitsSize - 1] != 9) {
        result = (int*)malloc(sizeof(int)*digitsSize);
        memcpy((void*)result,(void*)digits,sizeof(int)*digitsSize);
        *returnSize = digitsSize;
        result[digitsSize - 1] = digits[digitsSize - 1] + 1;
        return result;
    }
    
    /*最後一位是9*/
    for(int i=digitsSize - 1;;i--) {
        if(digits[i] != 9)
            break;
        if(i == 0) {
            //全都為9
            *returnSize = digitsSize + 1;
            result = (int*)malloc(sizeof(int)*(*returnSize));
            result[0] = 1;
            for(int j=1;j<*returnSize;j++)
                result[j] = 0;
            return result;
        }
    }
    //不全為9
    *returnSize = digitsSize;
    result = (int*)malloc(sizeof(int)*(digitsSize));
    int not_9_num = digitsSize - 1;
    for(;not_9_num >= 0;not_9_num--) {
        if(digits[not_9_num] != 9)
            break;
        result[not_9_num] = 0;
    }
    memcpy(result,digits,sizeof(int) * (not_9_num + 1));
    result[not_9_num] = digits[not_9_num] + 1;
    return result;
}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。