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;
}
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。