阿亮的算法之路——7. 整数反转

2024-01-07 02:59
文章标签 算法 反转 整数 阿亮

本文主要是介绍阿亮的算法之路——7. 整数反转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

题目描述

这题难度是简单,的确是这样。

首次尝试

思路

其实我一开始想到了移位,因为进行移位运算,效率更高,但是没不知道要怎么移位,或者说移位能不能实现,所以就用了最笨的办法,先实现功能。

要将一个数反转,计算出他的位数,然后再依次取出每一位,乘以相应的位权即可,最后求和。

例如:12,首先计算出它又两位,然后,取出2 乘以 10(2-1),再取出1乘以10(2-2),最后将其求和。

代码
		int y = x;int count = 0;while (y != 0){y = y/10;count ++;}long re = 0;for (int i = count-1;i >=0; i--){int temp = x%10;re += temp*Math.pow(10,i);x = x/10;}if (re > Integer.MAX_VALUE || re < Integer.MIN_VALUE)  { return 0; }return (int)re;

逻辑很简单,但是可能效率不是很理想,因为用了两次循环,我想一次搞定的,但是做不到,因为需要预先知道这个数的位数,才能在取出每个数字的时候,乘以相应的位权。

提交结果

提交结果1
果然不是很理想,我想到了另一个办法。

换个思路

上面那种做法,需要先统计出这个数字的位数,所以需要两次循环。那我能不能直接将这个数的每个位数直接交换呢?将这个数转换成一个字符数组不就好了嘛

代码
		boolean isMinus = false;if (x < 0){if (x == Integer.MIN_VALUE) return 0;x = -x;isMinus = true;}char[] chars = (x+"").toCharArray();int len = chars.length;for (int i = 0; i < len/2; i++){char temp = chars[len-1-i];chars[len-1-i] = chars[i];chars[i] = temp;}long re = Long.valueOf(new String(chars));if (isMinus)  re = - re;if (re > Integer.MAX_VALUE || re < Integer.MIN_VALUE) return 0;return (int)re;
提交结果

提交结果2

内存方面提高了不少,但是效率??效率为啥还降低了?现在遍历的次数,相当于是前一个思路的四分之一,按道理效率应该会提升诶,难道是转换成字符数组,会很耗时?

大佬思路

大佬果然是大佬,也是和我第一个方法那样的思路,但是处理得如此巧妙。我第一个方法,是先统计出有多少位,所以有了两次循环。大佬只用了一次循环,在取出每个数字的时候,就处理了。

代码
		int rev = 0;while (x != 0) {int pop = x % 10;x /= 10;if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;rev = rev * 10 + pop;}return rev;
提交结果

提交结果3

优秀啊!

这篇关于阿亮的算法之路——7. 整数反转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1