本系列通过JavaKotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~

阿俊带你用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)。

题解

大部分逻辑可以用数学表达式完成,举个例子:假设x123,袋盖步骤如下所示:

  1. 123 % 10 = 3​3就是最后一位,然后123 / 10得到12,结果就是3

  2. 12 % 10 = 22就是最后一位,然后12 / 10得到1,结果就是32

  3. 1 % 10 = 11就是最后一位,然后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:谭嘉俊


  1. \+\- ↩︎

  2. \\+\\- ↩︎

阿俊带你用Kotlin刷算法(三)相关推荐

  1. 阿俊带你用Kotlin刷算法(四)

    本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...

  2. 阿俊带你用Kotlin刷算法(一)

    本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...

  3. 阿俊带你用Kotlin刷算法(二)

    本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...

  4. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

  5. 刷算法的时候有没有必要自写测试用例?

    # 问题详述 刷算法的时候,我们是不是可以只是设计出算法,不写测试用例,直接用别人的数据集去测试就行了?换句话说,我们有没有必要自己写测试用例? # 个人看法 有,十分必要. # 测试用例可以促进工程 ...

  6. 5分钟带你理解一致性Hash算法

    转载自 5分钟带你理解一致性Hash算法 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot s ...

  7. 求带权中位数的Select算法

    2019独角兽企业重金招聘Python工程师标准>>> 求带权中位数的Select算法 设有一个数组a,元素类型为T,T的定义如下: struct T { int x: // 位置 ...

  8. 公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂

    ↑ 点击上方[计算机视觉联盟]关注我们 K近邻算法采用测量不同特征值之间的距离方法进行分类. K-近邻算法工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知 ...

  9. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

最新文章

  1. Js 校验时间、比较时间 和转换时间格式
  2. 如何在Pandas的DataFrame中的行上进行迭代?
  3. 009_jQuery链式编程
  4. jsp springmvc 视图解析器_Springmvc中多视图解析器解析问题
  5. Kubernetes 桌面客户端:Lens
  6. 使用Java中的Try-With-Resource
  7. 国内ios分亨组件,
  8. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]47.什么是Fiat-Shamir变换?
  9. centos ping不通百度 ping不通外网
  10. react setState里的作用域
  11. Unity3D_(插件)小地图自刷新制作Minimap小地图
  12. 工人与资本家互相养活,主动权在资本家手里
  13. 数据的正态性检验汇总
  14. python装逼代码_能够让你装逼的10个Python小技巧
  15. 虚拟服务器密码遗忘怎么办,win7虚拟机忘记密码怎么办_win7虚拟机忘记密码的解决方法...
  16. arduino蓝牙通讯代码_arduino蓝牙通讯
  17. 域名检测工具-免费老域名扫描软件下载
  18. python如何回退_Pycharm技巧之代码跳转该如何回退
  19. 《草根自媒体达人运营实战》一一1.3 各种自媒体平台及优缺点
  20. 远程开机(外网WOL远程唤醒)

热门文章

  1. word中多级列表操作问题
  2. 梦幻仙缘剧情java_梦幻仙缘BT版
  3. 和老板比,员工弱爆了
  4. GPGPU Achitectures阅读笔记 1
  5. win10 引导系统损坏 和 bios设置
  6. 自动驾驶 11-1: 光检测和测距传感器LIDAR Light Detection and Ranging Sensors
  7. 推导:从傅里叶级数展开到傅里叶变换
  8. html怎么做一条轴,html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果
  9. easy-table-vue+VueJs、SpringBoot+Mybatis实现MVVM模型前后台数据交互
  10. oracle数据库的scn,Oracle数据库SCN详解