力扣66题-加一

题目:给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

分析:函数有三个参数,分别用来传数组,传数组长度以及返回数组的长度(returnSize的类型为int*是因为传址才能在函数中改变该变量的值)函数返回类型为int*,题目要求返回malloc开辟的数组。

1.将原数组储存到新开辟的数组tmp。由于可能存在数组最高位进位,位数增加的情况,所以在创建数组时提前扩大一个int型,并且将数组后移一位,让tmp[0]作为最高位,并将其置为0。

2.数组加一分为进位和不进位两种情况,需要判断。因为是给该数字加一,所以进位一定是从最低位开始,所以逆序遍历数组。令tmp[i]=(tmp[i]+1)%10 若未进位,(tmp[i]+1)%10仍为本身,若进位,tmp[i]则为零。若tmp[i]不为0,说明不进位,则结束循环;若为0,则继续遍历高一位。

3.通过tmp[0]的值来判断最高位是否发生进位,若仍为0,则未发生进位,数字长度未变,将数组前移一位,return;若为1,则发生进位,将returnSize+1,return。

int* plusOne(int* digits, int digitsSize, int* returnSize) 
{
	int i = 0;
	*returnSize=digitsSize;
	//1.创建比原来数组大四个字节的空间,防止进位
	int* tmp = (int*)malloc(sizeof(int) * (digitsSize + 1));




	//2.将原数组中数据依次存入tmp中,但tmp[0]值为零,从tmp[1]开始存入
	for ( i = 0; i < digitsSize; i++)
	{
		tmp[i + 1] = digits[i];
	}
	tmp[0] = 0;




	//3.逆序遍历数组,判断是否进位
	for (i = digitsSize; i >= 0; i--)
	{
		tmp[i] = (tmp[i] + 1) % 10;
		if (tmp[i] == 0)
			continue;
		else
			break;
	}




	//4.若tmp[0]仍未0,说明最高位没有进位,将此时的数组往前挪一位;若tmp[0]为1,说明已经进位,直接返回
	if (tmp[0] == 1)
	{
		(*returnSize)++;
		return tmp;
	}
	else
	{
		for (i = 0; i < digitsSize; i++)
		{
			tmp[i] = tmp[i + 1]; 
		}
		return tmp;
	}
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值