数组输出数字特殊情况处理--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

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说