问题描述:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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;
}