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

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont