数组输出数字特殊情况处理--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+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

浅析Python中如何处理Socket超时

《浅析Python中如何处理Socket超时》在网络编程中,Socket是实现网络通信的基础,本文将深入探讨Python中如何处理Socket超时,并提供完整的代码示例和最佳实践,希望对大家有所帮助... 目录开篇引言核心要点逐一深入讲解每个要点1. 设置Socket超时2. 处理超时异常3. 使用sele

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr