阿俊带你用Kotlin刷算法(三)
本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~
阿俊带你用Kotlin刷算法(一)
阿俊带你用Kotlin刷算法(二)
阿俊带你用Kotlin刷算法(三)
项目的GitHub:Algorithm
整数反转(Reverse Integer)
难度:简单
链接:Reverse Integer
代码
Java
/*** Created by TanJiaJun on 2021/6/15.* 7. 整数反转(Reverse Integer)* 难度:简单** @see <a href="https://leetcode-cn.com/problems/reverse-integer/">Reverse Integer</a>*/
class ReverseInteger {public static void main(String[] args) {// 示例一System.out.print("示例一:");int firstNumber = 123;System.out.println(reverse(firstNumber));System.out.print("\n");// 示例二System.out.print("示例二:");int secondNumber = -123;System.out.println(reverse(secondNumber));System.out.print("\n");// 示例三System.out.print("示例三:");int thirdNumber = 120;System.out.println(reverse(thirdNumber));System.out.print("\n");// 示例四System.out.print("示例四:");int fourthNumber = 0;System.out.println(reverse(fourthNumber));System.out.print("\n");}/*** 时间复杂度:O(log|n|),其中n是整型x的位数* 空间复杂度:O(1)** @param x 整型x* @return 结果*/private static int reverse(int x) {int result = 0;while (x != 0) {// 得到最后一位,例如:123的3int digit = x % 10;if (result < -214748364 || (result == -214748364 && digit < -8)) {// 判断结果是否小于Integer.MIN_VALUE,也就是是否小于-2147483648return 0;}if (result > 214748364 || (result == 214748364 && digit > 7)) {// 判断结果是否大于Integer.MAX_VALUE,也就是是否大于2147483647return 0;}// 得到除了最后一位的前几位,例如:123的12x /= 10;result = result * 10 + digit;}return result;}}
Kotlin
/*** Created by TanJiaJun on 2021/6/26.* 7. 整数反转(Reverse Integer)* 难度:简单** @see <a href="https://leetcode-cn.com/problems/reverse-integer/">Reverse Integer</a>*/
object ReverseIntegerKotlin {@JvmStaticfun main(args: Array<String>) {// 示例一print("示例一:")val firstNumber = 123println(reverse(firstNumber))print("\n")// 示例二print("示例二:")val secondNumber = -123println(reverse(secondNumber))print("\n")// 示例三print("示例三:")val thirdNumber = 120println(reverse(thirdNumber))print("\n")// 示例四print("示例四:")val fourthNumber = 0println(reverse(fourthNumber))print("\n")}/*** 时间复杂度:O(log|n|),其中n是整型x的位数* 空间复杂度:O(1)** @param x 整型x* @return 结果*/private fun reverse(x: Int): Int {var result = 0var number = xwhile (number != 0) {// 得到最后一位,例如:123的3val digit = number % 10if (result < -214748364 || (result == -214748364 && digit < -8)) {// 判断结果是否小于Integer.MIN_VALUE,也就是是否小于-2147483648return 0}if (result > 214748364 || (result == 214748364 && digit > 7)) {// 判断结果是否大于Integer.MAX_VALUE,也就是是否大于2147483647return 0}// 得到除了最后一位的前几位,例如:123的12number /= 10result = result * 10 + digit}return result}}
时间复杂度:O(log|n|),其中n是整型x的位数。
空间复杂度:O(1)。
题解
大部分逻辑可以用数学表达式完成,举个例子:假设x是123,袋盖步骤如下所示:
123 % 10 = 3,3就是最后一位,然后123 / 10得到12,结果就是3。
12 % 10 = 2,2就是最后一位,然后12 / 10得到1,结果就是32。
1 % 10 = 1,1就是最后一位,然后1 / 10得到0,结果就是321,跳出循环。
要注意的是,根据题义可知,如果反转后整数超过32位的有符号整数的范围[2312^31231, 231−12^31 - 1231−1],就返回0,并且环境不允许存储64位整数(有符号或者没有符号),也就是说我们不能使用long类型存储结果,所以我们需要对其进行判断,让结果在**[2312^31231, 231−12^31 - 1231−1]范围中,也就是[-2147483648, 2147483647]范围中,也就是如果result的值小于214748364或者大于214748364都不符合,如果result的值刚好是214748364呢?那就判断下digit的值,也就是最后一位是否小于8或者大于7**。
字符串转整数(atoi)(String to Integer(atoi))
难度:简单
**链接:**https://leetcode-cn.com/problems/string-to-integer-atoi/
代码
Java
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** Created by TanJiaJun on 2021/6/18.* 8. 字符串转整数(atoi)(String to Integer(atoi))* 难度:简单** @see <a href="https://leetcode-cn.com/problems/string-to-integer-atoi/">String to Integer(atoi)</a>*/
class StringToInteger {public static void main(String[] args) {// 示例一System.out.print("示例一:");String firstStr = "42";System.out.println(myAtoi(firstStr));System.out.print("\n");// 示例二System.out.print("示例二:");String secondStr = "-42";System.out.println(myAtoi(secondStr));System.out.print("\n");// 示例三System.out.print("示例三:");String thirdStr = "4193 with words";System.out.println(myAtoi(thirdStr));System.out.print("\n");// 示例四System.out.print("示例四:");String fourthStr = "words and 987";System.out.println(myAtoi(fourthStr));System.out.print("\n");// 示例五System.out.print("示例五:");String fifthStr = "-91283472332";System.out.println(myAtoi(fifthStr));}/*** 时间复杂度:O(N),其中N是字符串的长度* 空间复杂度:O(1)** @param s 字符串* @return 结果*/private static int myAtoi(String s) {// 去掉字符串前面和后面的空格s = s.trim();// ^[\+\-]?的意思是判断字符是否匹配+或者-,匹配零次或者一次// \d+的意思是判断字符是否匹配[0-9],匹配一次或者多次Pattern pattern = Pattern.compile("^[\\+\\-]?\\d+");Matcher matcher = pattern.matcher(s);boolean isInteger = matcher.find();int result = 0;if (isInteger) {try {result = Integer.parseInt(s.substring(matcher.start(), matcher.end()));} catch (NumberFormatException exception) {// 如果抛出NumberFormatException异常,证明小于整型的最小值,大于整型的最大值result = s.charAt(0) == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE;}}return result;}}
Kotlin
import java.util.regex.Pattern/*** Created by TanJiaJun on 2021/6/26.* 8. 字符串转整数(atoi)(String to Integer(atoi))* 难度:简单** @see <a href="https://leetcode-cn.com/problems/string-to-integer-atoi/">String to Integer(atoi)</a>*/
object StringToIntegerKotlin {@JvmStaticfun main(args: Array<String>) {// 示例一print("示例一:")val firstStr = "42"println(myAtoi(firstStr))print("\n")// 示例二print("示例二:")val secondStr = "-42"println(myAtoi(secondStr))print("\n")// 示例三print("示例三:")val thirdStr = "4193 with words"println(myAtoi(thirdStr))print("\n")// 示例四print("示例四:")val fourthStr = "words and 987"println(myAtoi(fourthStr))print("\n")// 示例五print("示例五:")val fifthStr = "-91283472332"println(myAtoi(fifthStr))}/*** 时间复杂度:O(N),其中N是字符串的长度* 空间复杂度:O(1)** @param s 字符串* @return 结果*/private fun myAtoi(s: String): Int {// 去掉字符串前面和后面的空格val str = s.trim()// ^[\+\-]?的意思是判断字符是否匹配+或者-,匹配零次或者一次// \d+的意思是判断字符是否匹配[0-9],匹配一次或者多次val pattern = Pattern.compile("^[\\+\\-]?\\d+")val matcher = pattern.matcher(str)val isInteger = matcher.find()var result = 0if (isInteger) {result = try {str.substring(startIndex = matcher.start(), endIndex = matcher.end()).toInt()} catch (exception: NumberFormatException) {// 如果抛出NumberFormatException异常,证明小于整型的最小值,大于整型的最大值if (str[0] == '-') Int.MIN_VALUE else Int.MAX_VALUE}}return result}
}
时间复杂度:O(N),其中N是字符串的长度。
空间复杂度:O(1)。
题解
这道题我使用了正则表达式来解决,这里我解释下**1?\d+这段正则表达式**的含义:
- 2?的意思是判断字符是否匹配+或者-,匹配零次或者一次。
- \\d+的意思是判断字符是否匹配[0-9],匹配一次或者多次。
要注意的是,根据题义可知,结果要在**[2312^31231, 231−12^31 - 1231−1]范围内,所以如果抛出NumberFormatException异常的时候,需要将值设置为整型的最小值Int.MIN_VALUE(2312^31231,2147483648)或者最大值Int.MAX_VALUE(231−12^31-1231−1,2147483647)**。
回文数(Palindrome Number)
难度:简单
**链接:**https://leetcode-cn.com/problems/palindrome-number/
代码
Java
/*** Created by TanJiaJun on 2021/6/19.* 9. 回文数(Palindrome Number)* 难度:简单** @see <a href="https://leetcode-cn.com/problems/palindrome-number/">Palindrome Number</a>*/
class PalindromeNumber {public static void main(String[] args) {// 示例一System.out.print("示例一:");int firstNumber = 121;System.out.println(isPalindrome(firstNumber));System.out.print("\n");// 示例二System.out.print("示例二:");int secondNumber = -121;System.out.println(isPalindrome(secondNumber));System.out.print("\n");// 示例三System.out.print("示例三:");int thirdNumber = 10;System.out.println(isPalindrome(thirdNumber));System.out.print("\n");// 示例四System.out.print("示例四:");int fourthNumber = -101;System.out.println(isPalindrome(fourthNumber));}/*** 时间复杂度:O(N),其中N是整型x的位数* 空间复杂度:O(N),其中N是整型x的位数,因为要创建长度为位数的字符串** @param x 整型x* @return 结果*/private static boolean isPalindrome(int x) {// 将整型x转为字符串String str = String.valueOf(x);int length = str.length();// 只需要遍历该字符串长度一半就可以了for (int i = 0; i < length / 2; i++) {// 因为回文串的特性,我们可以用该字符和索引为length-i-1的字符比较是否相同就可以判断了if (str.charAt(i) != str.charAt(length - i - 1)) {// 只要有一个不相同,证明不是回文串return false;}}// 如果都相同,证明是回文串return true;}}
Kotlin
/*** Created by TanJiaJun on 2021/6/26.* 9. 回文数(Palindrome Number)* 难度:简单** @see <a href="https://leetcode-cn.com/problems/palindrome-number/">Palindrome Number</a>*/
object PalindromeNumberKotlin {@JvmStaticfun main(args: Array<String>) {// 示例一print("示例一:")val firstNumber = 121println(isPalindrome(firstNumber))print("\n")// 示例二print("示例二:")val secondNumber = -121println(isPalindrome(secondNumber))print("\n")// 示例三print("示例三:")val thirdNumber = 10println(isPalindrome(thirdNumber))print("\n")// 示例四print("示例四:")val fourthNumber = -101println(isPalindrome(fourthNumber))}/*** 时间复杂度:O(N),其中N是整型x的位数* 空间复杂度:O(N),其中N是整型x的位数,因为要创建长度为位数的字符串** @param x 整型x* @return 结果*/private fun isPalindrome(x: Int): Boolean {// 将整型x转为字符串val str = x.toString()val length = str.length// 只需要遍历该字符串长度一半就可以了for (i in 0 until length / 2) {// 因为回文串的特性,我们可以用该字符和索引为length-i-1的字符比较是否相同就可以判断了if (str[i] != str[length - i - 1]) {// 只要有一个不相同,证明不是回文串return false}}// 如果都相同,证明是回文串return true}}
时间复杂度:O(N),其中N是整型x的位数。
空间复杂度:O(N),其中N是整型x的位数,因为要创建长度为位数的字符串。
题解
由于回文串的特征是正读和反读都一样,例如:abba就是回文串,abda就不是回文串了,所以我们只要找到某个字符,并且找到该字符索引length-i-1的字符,只需要遍历该字符串长度一半就可以判断该字符串是否为回文串,要注意的是,我这里先将整型x转为字符串,然后再执行相应的逻辑即可。
我的GitHub:TanJiaJunBeyond
Android通用框架:Android通用框架
我的掘金:谭嘉俊
我的简书:谭嘉俊
我的CSDN:谭嘉俊
\+\- ↩︎
\\+\\- ↩︎
阿俊带你用Kotlin刷算法(三)相关推荐
- 阿俊带你用Kotlin刷算法(四)
本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...
- 阿俊带你用Kotlin刷算法(一)
本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...
- 阿俊带你用Kotlin刷算法(二)
本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...
- 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)
这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...
- 刷算法的时候有没有必要自写测试用例?
# 问题详述 刷算法的时候,我们是不是可以只是设计出算法,不写测试用例,直接用别人的数据集去测试就行了?换句话说,我们有没有必要自己写测试用例? # 个人看法 有,十分必要. # 测试用例可以促进工程 ...
- 5分钟带你理解一致性Hash算法
转载自 5分钟带你理解一致性Hash算法 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot s ...
- 求带权中位数的Select算法
2019独角兽企业重金招聘Python工程师标准>>> 求带权中位数的Select算法 设有一个数组a,元素类型为T,T的定义如下: struct T { int x: // 位置 ...
- 公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂
↑ 点击上方[计算机视觉联盟]关注我们 K近邻算法采用测量不同特征值之间的距离方法进行分类. K-近邻算法工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知 ...
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
最新文章
- Js 校验时间、比较时间 和转换时间格式
- 如何在Pandas的DataFrame中的行上进行迭代?
- 009_jQuery链式编程
- jsp springmvc 视图解析器_Springmvc中多视图解析器解析问题
- Kubernetes 桌面客户端:Lens
- 使用Java中的Try-With-Resource
- 国内ios分亨组件,
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]47.什么是Fiat-Shamir变换?
- centos ping不通百度 ping不通外网
- react setState里的作用域
- Unity3D_(插件)小地图自刷新制作Minimap小地图
- 工人与资本家互相养活,主动权在资本家手里
- 数据的正态性检验汇总
- python装逼代码_能够让你装逼的10个Python小技巧
- 虚拟服务器密码遗忘怎么办,win7虚拟机忘记密码怎么办_win7虚拟机忘记密码的解决方法...
- arduino蓝牙通讯代码_arduino蓝牙通讯
- 域名检测工具-免费老域名扫描软件下载
- python如何回退_Pycharm技巧之代码跳转该如何回退
- 《草根自媒体达人运营实战》一一1.3 各种自媒体平台及优缺点
- 远程开机(外网WOL远程唤醒)
热门文章
- word中多级列表操作问题
- 梦幻仙缘剧情java_梦幻仙缘BT版
- 和老板比,员工弱爆了
- GPGPU Achitectures阅读笔记 1
- win10 引导系统损坏 和 bios设置
- 自动驾驶 11-1: 光检测和测距传感器LIDAR Light Detection and Ranging Sensors
- 推导:从傅里叶级数展开到傅里叶变换
- html怎么做一条轴,html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果
- easy-table-vue+VueJs、SpringBoot+Mybatis实现MVVM模型前后台数据交互
- oracle数据库的scn,Oracle数据库SCN详解