力扣每日一题——加一


前言

题目:给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。


一、示例

在这里插入图片描述

二、思路和代码

1.引入库

此解法是适合新手看的,大神可以不看了。
分两大类情况,一类是尾数是9,另外一类不是9
不是9的那一类又分两类,一个是全都是9,另外一个是最高位不是9,尾数是9,但不知道有多少个9

2.代码

代码如下(示例):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int* digits, int digitsSize, int* returnSize){
    //加2是因为后面要补0,同时防止999后+1多了一个0
    int* ans_arr = (int*)malloc(sizeof(int) * (digitsSize+2));
    int i, n = 0;

    //如果最后一个不是9
    if(digits[digitsSize-1] != 9) {
        *returnSize = digitsSize;
        ans_arr[digitsSize-1] = digits[digitsSize-1] + 1;
        for(i = 0; i < digitsSize-1; i++) {
            ans_arr[i] = digits[i];
        }
        return ans_arr;
    } else {
    //如果最后一个数是9
        //n记录有多少个9
        for(i = 0; i < digitsSize; i++) {
            if(digits[i] == 9) {
                ++n;
            }
        }   
        //如果全都是9,+1就要变成最高位是1,其余是0 (9...99...999...)
        if(n == digitsSize) { 
            *returnSize = digitsSize+1;
            ans_arr[0] = 1;
            for(i = 1; i < (digitsSize+1); i++ ) {
                ans_arr[i] = 0;
            }
            return ans_arr;
        }  else {
            //最高位不是9,统计有多少个9,8999...8899..88999...889899........8889...
            int a = digitsSize-1;
            *returnSize = digitsSize;
            while(digits[a] == 9) {
                ans_arr[a] = 0;
                --a;
            }
            ans_arr[a] = digits[a] + 1;
            for(i = 0; i < a; i++) {
                ans_arr[i] = digits[i];
            }
            return ans_arr;
        }
    }
    return ans_arr;
}

结果如图所示:
在这里插入图片描述


总结

尽量不要直接使用参数传来的值,建议定义一个新的变量,然后把参数的值赋值给它

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free(me)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值