数组输出数字特殊情况处理--LeetCode66《Blind-Stab》

2023-10-18 18:20

本文主要是介绍数组输出数字特殊情况处理--LeetCode66《Blind-Stab》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode_66

题目:

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

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

你可以假设除了整数 0 之外,这个整数不会以零开头。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pl

 

 

 

 

 

 

 

 

解法

思路一:我们可以将数组里面的元素先转化为数字,然后加1之后然后在放入数组。

思路二:我们直接让数组最后一位加1就行了

但是:思路确实没错,但是我们要考虑有没有特殊情况,已知数组不为空那么这种情况我们就不考虑了。那如果加1之后产生了进位呢?如果全部是9呢,就是数字位数变成了n+1位了呢?

针对思路一的特殊情况的解法:定义一个变量将数组元素按位数转化为的数值存起来,然后判断是否变成了10000...这种形式的数,如果是,那么对原数组扩容,arr[0] = 1就行了,如果不是,那么直接放入原数组。返回。

针对思路二的特殊情况的解法:写一个倒循环,遍历原数组arr,并且直接从最后一位开始将arr[i]+1的值赋给一个变量num;然后让num]对10取余,如果不为0,那就arr[i]++;return arr;(注意,第一次加1的值赋给了num参与判断,而此时的arr[i]并没有加1,先用变量判断,可以直接加在加),如果为0,也就是说产生了进位,那就将arr[i] = 0;然后不用管了。

思路二的核心思想是,先用将加1的值赋给变量,本身不改变值;然后用这个变量去判断有没有进位,有进位,变0,i--;没进位,+1返回。

思路一代码:

public class LC66_2 {public static void main(String[] args) {int [] arr = {1,3,4};			//普通测试用例1int [] arr2 = {9,9,9};			//特殊测试用例2arr = plusOne(arr);				//传入测试数组1printArr(arr);					//打印加一后的数组arr2 = plusOne(arr2);			//传入测试用例2printArr(arr2);					//打印加一后的数组}public  static int[] plusOne(int[] arr) { //加一的方法实现int num = 0;for (int i = 0; i < arr.length; i++) {num = num*10 + arr[i];				//将数组转化为数字}int numNew = num + 1;					//转化为数字后+1得到目标数字if(!IsCarry(numNew)) {	//IsCarry(numNew)是判断+1后的数字是否产生进位,产生返回true,否则falsearr = numToArr(numNew,arr.length);	//没有产生进位则numToArr(numNew,arr.length)是将数字转化为数组,返回目标数组}else {arr = addArrLen(arr);	//产生了进位则必然是1000.。。。这样得形式, //对原数组进行扩容+1个长度,让arr指向新数组首地址}return arr;								//返回arr}public static int[] addArrLen(int[] arr) {	//实现扩容的方法int [] arrNew = new int[arr.length + 1]; //定义一个新的数组,长度比原来的数组长度多1arrNew[0] = 1;							//直接将新数组角标为0的元素赋值为1,其余因为初始化的原因为0,达到目的return arrNew;							//达到目的返回新数组}public static int[] numToArr(int numNew,int len) {//实现数字转化为数组的方法int [] arr = new int[len];						//先定义一个数组长度为lenfor (int i = arr.length - 1; i >= 0; i--) {arr[i] = numNew%10;							//辗转取余和除,求得得个数赋值给arr[i]numNew = numNew / 10;}return arr;}public static boolean IsCarry(int numNew) {	//实现判断是否产生进位得方法int sum = 0;while(numNew>0) {			//直接看所有位相加结果是否为1sum += numNew%10;numNew /= 10;}if(sum == 1) {return true;//是特殊情况}return false;//不是特殊情况}public  static void printArr(int[] arr) {			//实现打印方法System.out.print("[");for (int i = 0; i < arr.length; i++) {if(i == arr.length - 1) {System.out.print(arr[i] + "]");}else {System.out.print(arr[i] + ",");}}System.out.println("");}}

 思路二代码:

public class LC66T {public static void main(String[] args) {//定义测试数组1int arr1[] = {1,2,3,4};//调用加一方法arr1 = getPlusOne(arr1);//打印加一后的测试数组1print(arr1);//定义测试数组2int arr2[] = {9,9,9,9};//调用加一方法arr2 = getPlusOne(arr2);//打印加一后的测的数组2print(arr2);}public static int[]  getPlusOne(int[] arr) {//首先从数组最后一位开始遍历for (int i = arr.length - 1; i >= 0; i--) {//定义一个num来存储当前数组位值加一后的变化,但此时该位并未真正加一int num = arr[i] + 1;//定义一个carry存储num%10取余的结果int carry = num % 10;	//若carry == 0,说明当前数加一后产生了进位if(carry == 0) {	//既然产生了进位,那么该位就的变成0,因此直接赋值arr[i] = 0;			}else {//如果没有产生进位,那么该位加一就行arr[i]++;//返回数组return arr;			}}//但若是程序能运行到这里int [] arrNew = new int [arr.length + 1];//便说明传进来的数组值都是9,最高为都进位了//原数组长度不够,因此扩容,并arr[0]位直接为1就行了							arrNew[0] = 1;				return arrNew;		//返回新数组}public static void print(int [] arr) {	//打印方法System.out.print("[");for (int i = 0; i < arr.length; i++) {if(i!=arr.length - 1) {System.out.print(arr[i] + ",");}else {System.out.print(arr[i] + "]");}}}}

 总结:

一个题思路会有很多,没有最好,没有最优,但是我们尽可能的选择灵活,复杂度小的解法。

这题主要在于加一之后处理进位的问题,我觉得我的解法二有一个灵活之处在于一开始我并没有对最后一个数直接加一,而是用了一个num先存储加一后的值,在拿这个值去判断是否产生了进位,如果真的进位了,那我便直接让当前这个值为零。否则就直接加一。这种思路和想法其实是比较灵活的。也就是说,当一个值或说一个事物的改变还会对这个值或说这个事物造成二次改变,那么我们就不能贸然去改变这个值,应该先模拟,先试探,得出了结果再去改变。并且要注意因为一个值得改变带来得连锁反应,比如这一题,一个值改变,可能进位,那么他前面得值也得改,甚至全部进位那还得扩容。

 

 

完!

 

 

这篇关于数组输出数字特殊情况处理--LeetCode66《Blind-Stab》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234345

相关文章

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

Python自动化处理手机验证码

《Python自动化处理手机验证码》手机验证码是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景,下面我们来看看如何使用Python自动化处理手机验证码吧... 目录一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没