leetcode算法初级之——加一

问题描述:

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头


链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2cv1c/
来源:力扣(LeetCode)

问题分析:

存在三种情况:

   1.数组元素全部为9。此时加一后需要向最高位进位,需要对数组进行扩展。

   2.数组元素从后往前存在部分连续的9。此时需要将从后往前首个非9数字加一,其后所有9都变为0.

   3.不存在9。直接最后一位加一即可。

基于以上分析,给出以下解法:

  1.三判断暴力解法

int* plusOne(int* digits, int digitsSize, int* returnSize){

    int fin = digits[digitsSize - 1];

    int* arr = (int *)malloc(sizeof(int) * (digitsSize));

    int p = digitsSize - 1;

    *returnSize = digitsSize;

    while(p >= 0){

        if(digits[p] != 9){

            break;

        }

        p--; // p代表着从后往前第一个不是9的下标

    } // 从后往前判断9的个数

    int i;

    if(p == digitsSize - 1){ //情况一:没有9

       for(i = 0; i < digitsSize; i++){

           arr[i] = digits[i];

           if(i == digitsSize - 1){

               arr[i] = digits[i] + 1;

           }

       }

    }else if(p < 0){ // 情况二:全都是9

       arr = (int *)malloc(sizeof(int) * (digitsSize+1)); //考虑到进位,需要对数组进行扩展

       *returnSize = digitsSize + 1;

       arr[0] = 1;

       for(i = 1; i < *returnSize; i++){

           arr[i] = 0;

       }

    }else{   //情况三:部分是9

        arr[p] = digits[p] + 1; //p位+1

        for(i = p + 1; i < *returnSize; i++){ //p位往后全是0

            arr[i] = 0;

        }

        for(i = 0; i < p; i++){   //其他位置拷贝

            arr[i] = digits[i];

        }

    }

    return arr;

}

2.基于暴力解法的优化解法。

int* plusOne(int* digits, int digitsSize, int* returnSize){

    int p = digitsSize - 1;

    // 一般情况

    while(p >= 0){

        if(digits[p] != 9){ //找到倒数第一个非9位

            digits[p]++; //进位

            *returnSize = digitsSize;

            return digits;

        }else{

            digits[p] = 0; //非9位后经过进位全部变成0

        }

        p--;

    }

    //特殊情况:元素全为9

    int* arr = (int *)malloc(sizeof(int) * (digitsSize + 1));//扩展数组长度

    *returnSize = digitsSize + 1;

    int i;

    arr[0] = 1; //由于全部进位,第一位为1,其他全为0

    for(i = 1; i < *returnSize; i++){

        arr[i] = 0;

    }

    return arr;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值