LeetCode | 66.加一
题目描述
题目直接从 LeetCode 上截图过来,题目如下:
这道题目的思路比较符合我们平时列竖式的思路,这道题目我使用 C 语言进行完成,看我下面的分析。
问题分析
这道题目是给出一个数组,数组的每个元素都是一个个位数,然后对数组的最后一个元素进行加一的操作,加一的操作看似很容易,但是需要考虑两个问题点。
如果数组的最后一个元素是一个小于 9 的元素,那么直接加一就算完成了整个数组的加一操作。但是,如果数组的最后一个元素是 9,那么就会向数组的倒数第二个元素进行进位,因为要保持每个数组的元素都是一个个位数。因此,我们就需要对数组的倒数第二个元素的值也做加一。那么当数组的倒数第二个元素在加一后也产生进位,那么就需要接着把进位向前相加。
最后一个元素小于9的情况
倒数两个元素都等于9的情况
这个问题这样其实还不算完,当我们对数组最后一个元素进行加一,并且对最后一个元素之前的元素进行进位调整的时候,我们会从数组的最后一个元素向数组的第一个元素这样倒序进行操作。而当数组的每一位都为 9 的时候,进行加一的数组比原始数组是多一个元素的。
两个数组的元素不同
在原始数组中每一个元素都是 9 的情况下,我们新数组的数组元素个数一定要比原始数组的元素个数多一个。不但如此,在前面两幅图中,循环的时候,两个数组的下标是相同的。而对于当前图来说,两个数组在进行循环的时候,下标是不相同的。(这段话可能表达的不是很清楚,请看代码进行理解吧)
代码实现
代码实现如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize){
if (digits == NULL) {
*returnSize = 0;
return NULL;
}
int* pArr = NULL;
int size = digitsSize;
int i = 0;
// 如果 digits 每一位都为 9,申请内存时要多一个元素
for (; i < digitsSize; i ++) {
if (digits[i] != 9) {
break;
}
}
// 新数组长度
// 原始数组的每位都为9
if (i == digitsSize) {
size = digitsSize + 1;
}
pArr = (int *)malloc(size * sizeof(int));
// 进位标志
int sf = 1;
// 原始数组最后一个元素的下标
i = digitsSize - 1;
// 新数组最后一个元素的下标
int j = size - 1;
while (i >= 0) {
pArr[j] = (digits[i] + sf) % 10;
sf = (digits[i] + sf) / 10;
i --;
j --;
}
// 调整最高位
if (j >= 0) {
pArr[0] = sf;
}
*returnSize = size;
return pArr;
}
提交结果
在写完 plusOne 函数体后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们继续修改代码。我们以上代码 “提交” 以后的截图如下:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 窗体UserForm——选项按钮
- OpenCV与图像处理(六)
- 常用功能加载宏——单元格区域数据交换
- 窗体UserForm——我也是类
- OpenCV与图像处理(四)
- 常用功能加载宏——单元格数据连接
- Nest.js 从零到壹系列(八):使用 Redis 实现登录挤出功能
- 创建常用功能加载宏
- 3分钟短文 | Linux 使用curl发起post请求的4个常用方式
- 类模块——接口
- OpenCV与图像处理(三)
- 常用功能加载宏——单元格数字转变
- OpenCV与图像处理(二)
- ECCV2020 | SOD100K:超低参数量的高效显著性目标检测算法,广义OctConv和动态权重衰减
- Rust FFI 编程 - Rust导出共享库02