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 函数体后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们继续修改代码。我们以上代码 “提交” 以后的截图如下:
- 优化Postgres-x2 GTM
- 启用某些Linux发行版的root帐号
- Linux中的完美截图工具:Deepin-ScreenShot
- ASM 翻译系列第二十弹:ASM Internal ASM file number 7
- Linux:awk命令详解
- 给已安装的Linux新增Swap交换分区
- ASM 翻译系列第二十一弹:ASM Attributes Directory
- Linux:sed命令详解
- ASM 翻译系列第二十二弹:ASM Internal ASM file number 8
- Ghost安装Win7/XP后自动恢复IP的批处理
- ASM 翻译系列第二十三弹:ASM Internal ASM files number 12 and 254
- Shell脚本的简单排错法及调试程序bashdb
- ASM 翻译系列第二十四弹:ASM Internal ASM files number 10 and 11
- Redhat设置NFS挂载的简单步骤
- 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 数组属性和方法
- 微信小程序【浅提WXSS样式】
- Kubernetes Liveness and Readiness Probes
- Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库
- pytest文档59-运行未提交git的用例(pytest-picked)
- pytest文档57-单元测试代码覆盖率(pytest-cov)
- pytest文档58-随机执行测试用例(pytest-random-order)
- Kubernetes探针踩坑记
- 大揭秘| 我司项目组Gitlab Flow && DevOps流程
- 离线安装Superset 0.37(截图详细版)
- 如何高速转储、索引和第7层网络流量过滤?
- 爬虫 | JS逆向某验滑动加密(二)
- 闲聊 Kotlin-Native (0) - 我们为什么应该关注一下 Kotlin Native?
- 哈佛大学单细胞课程|笔记汇总 (五)
- 通过源码理解IGMP v1的实现(基于linux1.2.13)
- 微服务下数据一致性的几种实现方式