66. 加一

题目描述: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

直接对数组最后一个元素进行加一操作,判断特殊情况:最后一位是否为9,如果是9的话需要进位,前一位加1;循环计算前一位的数字,判断到第一位的时候,如果第一位大于9则在最前面再加一个数字

//C

int* plusOne(int* digits, int digitsSize, int* returnSize){
    int i;
    digits[digitsSize - 1] += 1;
    for(i = digitsSize - 1; i > 0; i--){
        if(digits[i] >= 10) {
            digits[i] %= 10; 
            digits[i - 1] += 1;
        }
        else 
            break;
    }
    if(digits[0] >= 10) {
        digits[0] %= 10;
        *returnSize = digitsSize + 1; 
        int *res = (int *)malloc(sizeof(int) * (*returnSize));
        res[0] = 1;
        digits[0] = 0;
        for(i = 0; i < digitsSize; i++) res[i + 1] = digits[i];
        return res;
    }
    else{
        *returnSize = digitsSize;
        int *res = calloc(*returnSize, sizeof(int));
        memcpy(res, digits, sizeof(int) * (*returnSize));
        return res;
    }     
}

//JS
var plusOne = function(digits) {
    digits[digits.length - 1]++;
    for(var i = digits.length - 1; i > 0; i--){
        if(digits[i] >= 10) {
            digits[i] %= 10;
            digits[i - 1] += 1;
        }
        else
            break;
    }
    if(i == 0 && digits[i] >= 10) {
        digits[i] %= 10;
        digits.unshift(1);
    }
    return digits;
};

使用变量记录每个位置的进位

//C

int* plusOne(int* digits, int digitsSize, int* returnSize){
    int i, carry = 0;
    int *p = (int *)malloc(sizeof(int) * digitsSize);
    for(i = digitsSize - 1; i >= 0; i--){
        p[i] = digits[i] + carry;
        if(i == digitsSize - 1) p[i] += 1;
        if(p[i] == 10) {
            p[i] = 0; 
            carry = 1;
        }
        else 
            carry = 0;
    }
    if(carry == 1) {
        *returnSize = digitsSize + 1; 
        int *q = (int *)malloc(sizeof(int) * (*returnSize));
        q[0] = 1;
        for(i = 0; i < digitsSize; i++) q[i + 1] = p[i];
        return q;
    }
    else{
        *returnSize = digitsSize;
        return p;
    }     
}

//JS

var plusOne = function(digits) {
    let tmp = 0;
    for(let i = digits.length - 1; i >= 0 ; i--) {  
        digits[i] += tmp;  
        if(i == digits.length - 1) digits[i]++;   
        if(digits[i] >= 10) {
            digits[i] = 0;
            tmp = 1;
        }
        else {           
            tmp = 0;
        }
    }
    if(tmp == 1){
        digits.unshift(1);
    }
    return digits;
};

JS里ES10中的新的基本类型BigInt,它可以兼容大数

//JS

var plusOne = function(digits) {
    return (BigInt(digits.join('')) + 1n).toString().split('').map(Number);
};

  

 

posted @ 2020-06-10 18:52  Jessey45  阅读(147)  评论(0编辑  收藏  举报