Leetcode基础篇30天30题系列之数组:模拟计算法
作者:丁宋涛
数组:加一
题干:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
参考样例:
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
这道题是一道数组的基础题,其本质是一道模拟计算题。
这道题有一定的工程应用意义,大家都知道,计算机的浮点数运算有误差,究其细节有相当数量的开发者却往往不求甚解。请看:
做开发的朋友都知道计算机在程序处理中,都是将十进制数转成二进制数进行运算的。对于这种转化,其方法就是除2逆向取余法,例如:
十进制数13转成二进制的方法就是

转化成数学表达式就是(13)10=(1101)2
对于十进制小数转化成二进制小数使用的方法是乘2正向取整法,比如十进制的0.75
即(0.75)10=(0.11)2

如果,我们考虑下将十进制的0.6转化成二进制呢?如果依然使用乘二正向取整法会发生什么呢?

如果从数学上讲,(0.75)10=(0.1001)2
为什么会出现这种循环表示呢?因为数学上有证明,十进制表示法与二进制表示法,仅仅在整数范围内才有明确的对应的关系,而小数部分是做不到的。因此,在采用二进制运算上,计算机的数值求解是有缺陷的。
意识到这一点,我们就会问那么是不是我们现在和小数点相关的运行都是不可靠的呢?显然不可能,最常见的就是我们的金融活动。大凡和交易有关的数据,那是一个数字都不能出错的,那么他们背后的计算过程又是如何保证的呢?
答案就是模拟计算。
在小学数学课本上就教过这样的案例:123.4+5.67,我们来看,加数与被加数的位数并不相同,小学老师在教学中一定会强调对齐小数点,其过程如下:

这个在计算机中有一个术语叫做对阶。所谓阶就是进制,十进制的阶就是10,二进制的阶就是2,具体的数学表达就是
123.4 = 1×102+2×101+3×100+4×10-1
5.67=5×100+6×10-1+7×10-2
我们知道计算机的整数运算是没有缺陷的,如果我们这样做,是不是就可以达到精确求解的目的了?
123.4+5.67=(12340+567)×10-2=12907×10-2=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,就完成了全部的计算过程。


Leetcode基础篇30天30题系列之数组:模拟计算法的更多相关文章
- C++基础知识面试精选100题系列(11-20题)[C++ basics]
[原文链接] http://www.cnblogs.com/hellogiser/p/100-interview-questions-of-cplusplus-basics-11-20.html [题 ...
- C++基础知识面试精选100题系列(1-10题)[C++ basics]
[原文链接] http://www.cnblogs.com/hellogiser/p/100-interview-questions-of-cplusplus-basics-1-10.html [题目 ...
- C++基础知识面试精选100题系列(21-30)[C++ basics]
[本文链接] http://www.cnblogs.com/hellogiser/p/100-interview-questions-of-cplusplus-basics-21-30.html [题 ...
- PHP 基础篇 - PHP 的 BC MATH 系列数学函数
一.常见问题 用 PHP 做计算时经常会遇到精度带来的问题,下面来看两个常见的例子: 1. 运算比较 下面表达式输出的结果不是相等: <?php echo 2.01 - 0.01 == 2 ? ...
- 【Java 基础篇】【第二课】基本数组类型
就像第一章所说一样,这次学习为了快,因此说明性的文字就不想写太多了,直接帖代码吧,代码当中尽量加一些注释: package a.b; public class test { static void B ...
- [ 9.11 ]CF每日一题系列—— 441C暴力模拟
Description: n * m 的地图,建设k个管道管道只能横竖走,且长度大于等于2,问你任意一种建设方法 Solution: 图里没有障碍,所以先把前k - 1个管道每个分2个长度,最后一个管 ...
- SQL Server调优系列基础篇(联合运算符总结)
前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...
- SQL Server调优系列基础篇(并行运算总结)
前言 上三篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符.联合运算符的优化技巧. 本篇我们分析SQL Server的并行运算,作为多核计算机盛行的今天,SQL Server也会适时调整自 ...
- SQL Server调优系列基础篇(并行运算总结篇二)
前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...
随机推荐
- 前端js之JQuery
目录 jQuery介绍 jQuery的优势 jQuery内容 jQuery对象 jQuery基础语法结构 jQuery 使用注意事项 查找标签 基本选择器 层级选择器 基本选择器 属性选择器 表单筛选 ...
- django开发博客01-页面展示数据库中的数据
1.首先在views.py中引入models.py的 Category这个类 然后在函数中(blog)写执行逻辑 categorys 返回的对象是是一个list"<QuerySet [ ...
- 微信支付(公众号)爬坑记,包含 total_fee 失败和 JSAPI 签名验证失败等等
做商城类网站不免会需要做支付功能,目前在中国大陆通用的做法就是使用支付宝支付和微信支付,上一篇博文已经讲个支付宝支付. 这篇文章来讲一讲微信支付,微信支付的方式有很多种,本文主要讲 JSAPI 支付的 ...
- Unity3D_(插件)DOTween动画插件
使用DOTween动画插件来实现物体的移动动画 Learn 一.DOTween插件对变量的动画 二.控制Cube和UI面板的动画 三.动画的快捷播放方式 四.动画的前放和后放 五.From Tween ...
- 安装破解confluence6.7.1(插图丢了,一直懒得补)
JIRA安装:https://www.cnblogs.com/wei9593/p/10194784.html 1环境: centos7.2 java-1.8https://www.cnblogs. ...
- HTML DOM的学习
请看下面的 HTML 片段: <html> <head> <title>DOM 教程</title> </head> <body> ...
- python学习之路(11)
切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> list=['zh','cn','sqlmap','nmap','znamp'] 取前3 ...
- python环境下安装virtualenv,virtualenvwrapper
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- Zookeeper基础命令操作
转载链接:https://blog.csdn.net/dandandeshangni/article/details/80558383 安装参考链接https://blog.csdn.net/qiun ...
- NP-Hard问题和NP-Complete问题
对 NP-Hard问题和NP-Complete问题的一个直观的理解就是指那些很难(很可能是不可能)找到多项式时间算法的问题.因此一般初学算法的人都会问这样一个问题:NP-Hard和NP-Complet ...