Leetcode笔记整理—easy篇—66.Plus one

问题描述:

Given a non-empty array of digits representing a non-negative integer, plus one to the integer.

The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit.

You may assume the integer does not contain any leading zero, except the number 0 itself.
Example 1:

Input: [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.

Example 2:

Input: [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.

分析:

本题是一个对数组进行操作的题目,而题目最大的难点其实在于对于题目背景与题目本身算法这两件事情之间的分离,题目给出的背景是将一个整数的各位数字转化为数组对应的各个元素,给出这一数组,要求对数组的最后一个元素数加一,且符合整数运算的进位规则。
而这里面隐藏着一个十分容易误犯的思维误区:就是还原的原始的整数。
这种算法的思路就是将给定数组还原成原始整数对其加一再将其切片,转回数组并传回。
但实际操作之后我们不难发现,这一算法虽然好想,但却伴随着几个十分致命的问题:

  • 空间问题。由于传入数组大小不一,若数组位数过长,则就需要一个很大的变量来存储转换完成的的整数,空间占用巨大。
  • 时间问题。由于在算法的最后需要将整数在重新切片转化成数组,而这就必须牵扯到除、余操作,势必会浪费大量的时间。
  • 异常问题。由于进位和首位含零的特殊情况的影响,对于异常的处理就会变得非常复杂,设计难度直线提升。

综上,我们不难看出,在算法设计的初期必须要严谨的分析问题的实质和特征,一旦以错误的思路开始设计不仅劳民伤财,甚至最后都有可能无法完成任务。
而对于本题来讲,回到刚才那个问题,本题实际是一个对于数组元素进行操作的问题,无需整数的参与;所以我们可以这样思考:(注意,以下涉及剧透( • ̀ω•́ )✧)

Xmind友情赞助
通过上面的图片我们基本明确的思路,那么剩下的的就是兑现代码了,以下是我的实现思路:

int* plusOne(int* digits, int digitsSize, int* returnSize) { 
		int * ret = 0;//需返回数组
		int i = 0,j = 0;

		for(i = digitsSize-1; digits[i] == 9; i--){//倒叙查9的个数,并进位
			digits[i] = 0;
		}
		if(i>=0){//非全9的情况
			*returnSize = digitsSize;
			ret=(int *)malloc((digitsSize)*sizeof(int));
			digits[i]++;
			for(i = 0; i < digitsSize;i++){
					ret[i] = digits[i];
			}
			return ret;
		}
		if(i < 0){//全9的情况
			*returnSize = digitsSize+1;//数组长度增长
			ret=(int *)malloc((digitsSize+1)*sizeof(int))+1;
			ret[0] = 1;
			for(i = 1; i < *returnSize;i++){
				ret[i] = 0;
			}
			return ret;
		}
		return ret;//防误报
}

结果
通过提交结果我们不难看到,纯数组操作取得了比较好的结果,也进一步印证了在算法实现之前要充分考虑到数据结构的特征和优势,而不是一味依照第一感觉行事。
本次就不展示其他大神的代码了,看了一下大同小异,只要能跳出那个误区本题基本都能获得优秀的实现结果。
最后,希望诸位能从我的总结中有所收获。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值