做者:丁宋涛html
数组:加一
题干:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每一个元素只存储一个数字。
你能够假设除了整数 0 以外,这个整数不会以零开头。
参考样例:
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
这道题是一道数组的基础题,其本质是一道模拟计算题。
这道题有必定的工程应用意义,你们都知道,计算机的浮点数运算有偏差,究其细节有至关数量的开发者却每每不求甚解。请看:
作开发的朋友都知道计算机在程序处理中,都是将十进制数转成二进制数进行运算的。对于这种转化,其方法就是除2逆向取余法,例如:
十进制数13转成二进制的方法就是
转化成数学表达式就是(13)₁₀=(1101) ₂
对于十进制小数转化成二进制小数使用的方法是乘2正向取整法,好比十进制的0.75
即(0.75)₁₀=(0.11) ₂
若是,咱们考虑下将十进制的0.6转化成二进制呢?若是依然使用乘二正向取整法会发生什么呢?
若是从数学上讲,(0.75)₁₀=(0.1001) ₂
为何会出现这种循环表示呢?由于数学上有证实,十进制表示法与二进制表示法,仅仅在整数范围内才有明确的对应的关系,而小数部分是作不到的。所以,在采用二进制运算上,计算机的数值求解是有缺陷的。
意识到这一点,咱们就会问那么是否是咱们如今和小数点相关的运行都是不可靠的呢?显然不可能,最多见的就是咱们的金融活动。大凡和交易有关的数据,那是一个数字都不能出错的,那么他们背后的计算过程又是如何保证的呢?
答案就是模拟计算。
在小学数学课本上就教过这样的案例:123.4+5.67,咱们来看,加数与被加数的位数并不相同,小学老师在教学中必定会强调对齐小数点,其过程以下:
这个在计算机中有一个术语叫作对阶。所谓阶就是进制,十进制的阶就是10,二进制的阶就是2,具体的数学表达就是
123.4 = 1×10²+2×10¹+3×100+4×10-¹
5.67=5×100+6×10-¹+7×10-²
咱们知道计算机的整数运算是没有缺陷的,若是咱们这样作,是否是就能够达到精确求解的目的了?
123.4+5.67=(12340+567)×10²=12907×10-²=129.07
这就是精度计算中的经常使用的计算思想,这也是为何在以Java为核心语言中作交易系统中,金额一般不用float,double而用decimal类型的缘由。
明白了这个知识,咱们就知道了这个看似普通的题目,实际上是企业开发商用软件中的一个现实问题。那么,在现实计算中,人们又是如何来处理上述的对阶、运算的过程呢?答案就是数组。咱们用数组来模拟每一位,而后用小学数学课本教授的方法,手工计算出就能够了。
下面回到这个题目:题目的函数签名是这样的:vector<int> plusOne(vector<int>& digits)
传入的参数是digits,是一个整型的向量,其位数按照角标升序排列,即角标0对应的是数字的最高位,最后一位表示的数字的最低位,好比参考样例:[1,2,3],他表示的是十进制123,角标0对应的是百位1,角标2对应的是个位3.模拟十进制计算的过程,就是逢10进位,这道题咱们首先要找到最低位,若是最低位不是9,直接取出角标对应的数值加1便可,若是是数字的9的话,那么直接将其改成0,并向其上一位角标对应的数字加1.须要注意的细节是,若是这个数字刚好是[9,9,9],那么返回值应当增长1位获得[1,0,0,0]。为了方便编程,咱们从最后一位开始。代码以下:
1 vector<int> plusOne(vector<int>& digits) {
2 int n = digits.size();
3 for(int i=n-1;i>=0;i--){
4 if(digits[i] == 9)
5 digits[i] =0;
6 else {
7 digits[i]++;
8 return digits;
9 }
10 }
11 digits[0] =1;
12 digits.push_back(0);
13 return digits;
14 }
第2行,首先得到当前向量digits的长度,并将其复制给n,而后从角标n-1开始,逆向遍历整个数组,因为i是从n-1开始,咱们先判断当前位置是不是9,若是是9,那么就把把当前位置置0,并向前遍历到前一个位置,只要前一个位置不是9,那么就把此时的位置加1,而后返回。若是全体循环结束都没有返回,那么说明传入的必然是999这种类型的。那么出了循环以后,先把角标0改成1,并再增长一个0,就完成了所有的计算过程。
课程连接:https://edu.51cto.com/course/18440.htmlgit