加一(Leetcode)

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

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

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

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
    	  
      	int size = digits.size()-1;
        while(size>=0 && digits[size]==9)
        {
            digits[size] = 0;
            --size;
        }
        if(size < 0)
            digits.insert(digits.begin(), 1);
        else
            ++digits[size];
      	return digits;
  	}
};
LeetCode 问题是要对一个数组表示非负整数。以下是几种不同的 C 语言实现方法: ### 实现方法 ```c int* plusOne(int* digits, int digitsSize, int* returnSize) { digits[digitsSize-1]++; for (int i = digitsSize-1; i > 0; i--) { if (digits[i] - 10 >= 0) { digits[i] -= 10; digits[i-1]++; } } if (digits[0] >= 10) { int *arr = (int*)malloc(sizeof(int) * (digitsSize + 1)); digits[0] -= 10; arr[0] = 1; for (int i = 0; i < digitsSize; i++) { arr[i + 1] = digits[i]; } *returnSize = digitsSize + 1; return arr; } else { *returnSize = digitsSize; return digits; } } ``` ### 实现方法二 ```c /** * Note: The returned array must be malloced, assume caller calls free(). */ int* plusOne(int* digits, int digitsSize, int* returnSize) { if (digits == NULL && digitsSize == 0) { *returnSize = 0; return NULL; } int i; for (i = digitsSize - 1; i >= 0; i--) { if (digits[i] == 9) { digits[i] = 0; } else { digits[i]++; *returnSize = digitsSize; return digits; } } *returnSize = digitsSize + 1; int *a = (int*)malloc((digitsSize + 1) * sizeof(int)); memset(a, 0, (digitsSize + 1) * sizeof(int)); a[0] = 1; return a; } ``` ### 实现方法三 ```c #include <stdio.h> #include <stdlib.h> // 创建一个返回 int *的函指针,因为最后要有一个数组来接受函的返回值 // int *digits 参接受数组,digitsSize 代表数组的大小 int* plusOne(int* digits, int digitsSize, int* returnSize) { int i; // 申请了一个比原数组大的数组 int* ree = (int*)malloc((digitsSize + 1) * sizeof(int)); for (i = digitsSize - 1; i >= 0; i--) { if (digits[i] < 9) { digits[i] = digits[i] + 1; break; } else { digits[i] = 0; } } // 全为 9 的情况 if (digits[0] == 0) { int j; for (j = 0; j < digitsSize + 1; j++) { ree[j] = 0; } ree[0] = 1; *returnSize = digitsSize + 1; return ree; } else { *returnSize = digitsSize; return digits; } free(ree); ree = NULL; } ``` ### 实现方法四 ```c /** * Note: The returned array must be malloced, assume caller calls free(). */ int* plusOne(int* digits, int digitsSize, int* returnSize) { for (int i = digitsSize - 1; i >= 0; i--) { if (digits[i] + 1 == 10) { digits[i] = 0; } else { digits[i] += 1; *returnSize = digitsSize; return digits; } } *returnSize = digitsSize + 1; int *temp = (int*)malloc(sizeof(int) * (digitsSize + 1)); memset(temp, 0, sizeof(int) * (digitsSize + 1)); temp[0] = 1; return temp; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值