当前位置:网站首页>Kotlin算法入门求回文数算法优化一
Kotlin算法入门求回文数算法优化一
2022-08-11 08:01:00 【易庞宙】
class PalindromeNumber { /** * 创建map集合存储数据然后对数据进行判断抛出 */ private val palindromeData = HashMap<Int, ArrayList<String>>() /** * 讲数字直接转为字符串然后通过字符串中间截取用两个首尾进行对比得出 */ fun isPalindromeNumber(number: Long): Boolean { //个位直接返回 小于100的回文数都是可以整除11 整除10的数绝对不是回文数 if (number < 10) return true if (number < 100) return number!! % 11 == 0L if (number!! % 10 == 0L) return false val numbers = number.toString() + "" /*三位数回文数例如:121 131 151等等都是前后相同则直接判断是否前后相同相同直接返回 * 然后符合规则的数字放入一个key为5的map里面一个List集合中去 * 当number为5为数字的时候判断第一个数根最后一个数是否相同 * 相同则去除首尾取中间进行对比 * 是否map中key为5的集合中是否含有余下的这三位数有则返回true反之flase * 其中返回前如果true则放入一个key为7的List中去进行递归字典处理 * 偶数位的回文数与基数位的回文数处理类似所以不在讲解*/ if (number > 100 && number <= 999) { if (number / 100 == number % 10) { (palindromeData as java.util.Map<Int, ArrayList<String>>).computeIfAbsent(5) { k -> ArrayList() } palindromeData[5]!!.add(numbers) return true } else return false } if (number >= 1001 && number <= 9999) { if (number / 1000 == number % 10 && number / 100 % 10 == number % 100 / 10) { (palindromeData as java.util.Map<Int, ArrayList<String>>).computeIfAbsent(6) { k -> ArrayList() } palindromeData[6]!!.add(numbers) return true } return false } val firstNumber = numbers.substring(0, 1) val lastNumber = numbers.substring(numbers.length - 1, numbers.length) if (firstNumber != lastNumber) return false val length = numbers.length val subString = numbers.substring(1, length - 1) return if (Integer.parseInt(subString) == 0) true else ismapData(numbers, length, number, subString) } private fun baseIsPalindromeNumber(numberFrist: String, numbersLast: String, numbersLast2: String): Boolean { var numbersLast2 = numbersLast2 var i = 0 while (i < numbersLast.length) { val index = numbersLast.length - i - 1 if (i == 0) { /*为了避免进行大数据类型遍历的加上第一位数的判断如果不相同直接返回以此减少每一次需要进行数据逆转的次数 数据长度的记为n 则减少n/2-1次的判断次数 */ numbersLast2 = numbersLast2 + numbersLast.substring(index) if (numberFrist.substring(0, 1) != numbersLast2) return false } else { numbersLast2 = numbersLast2 + numbersLast.substring(index, index + 1) if (index == 2 || index == 5 || index == 8) { if (numberFrist.substring(0, numbersLast2.length) != numbersLast2) return false } } ++i } return numberFrist == numbersLast2 } private fun olderIsPalindromeNumber(number: Long): Boolean { //个位直接返回 小于100的回文数都是可以整除11 整除10的数绝对不是回文数 // System.out.println(number+"num"); if (number < 10) return true if (number < 100) return number!! % 11 == 0L if (number!! % 10 == 0L) return false val numbers = number.toString() + "" // System.out.println(numbers); /*System.out.println("number = [" + numbers.length() + "]");*/ val halfIndex = numbers.length / 2 val numberFrist = numbers.substring(0, halfIndex - 1) var numbersLast = "" val numbersLast2 = "" //对最后字符串截取需要注意的是字符串长度是否为偶数 if (numbers.length / 2 == 0) { numbersLast = numbers.substring(halfIndex - 1) } else { numbersLast = numbers.substring(halfIndex + 1) } // System.out.println(numberFrist+ "ssss "+numbersLast); return baseIsPalindromeNumber(numberFrist, numbersLast, numbersLast2) } private fun ismapData(numbers: String, length: Int, number: Long, subString: String): Boolean { if (palindromeData[length] != null) { // System.out.println("notnull sub:"+numbers.substring(1,length-1)); if (palindromeData[length]!!.contains(subString)) { (palindromeData as java.util.Map<Int, ArrayList<String>>).computeIfAbsent(length + 2) { k -> ArrayList() } palindromeData[length + 2]!!.add(numbers) return true } else { val next = Math.pow(10.0, (length - 1).toDouble()).toLong() val last = Math.pow(10.0, (length - 2).toDouble()).toLong() if (number > next + last + 11) return false if (subIsPalindromeNumber(numbers)) { (palindromeData as java.util.Map<Int, ArrayList<String>>).computeIfAbsent(length + 2) { k -> ArrayList() } palindromeData[length + 2]!!.add(numbers) palindromeData[length]!!.add(subString) return true } return false } } else { if (subIsPalindromeNumber(numbers)) { (palindromeData as java.util.Map<Int, ArrayList<String>>).computeIfAbsent(length + 2) { k -> ArrayList() } palindromeData[length + 2]!!.add(numbers) return true } else return false } } private fun subIsPalindromeNumber(numbers: String): Boolean { val halfIndex = numbers.length / 2 val numberFrist = numbers.substring(0, halfIndex - 1) var numbersLast = "" val numbersLast2 = "" //对最后字符串截取需要注意的是字符串长度是否为偶数 if (numbers.length / 2 == 0) { numbersLast = numbers.substring(halfIndex) } else { numbersLast = numbers.substring(halfIndex) } return baseIsPalindromeNumber(numberFrist, numbersLast, numbersLast2) } }
边栏推荐
- 用 Antlr 重构脚本解释器
- 如何仅更改 QGroupBox 标题的字体?
- 项目1-PM2.5预测
- About # SQL problem: how to set the following data by commas into multiple lines, in the form of column display
- 经典论文-MobileNet V1论文及实践
- 2021-08-11 For loop combined with multi-threaded asynchronous query and collect results
- RestTemplate工具类
- go-grpc TSL authentication solution transport: authentication handshake failed: x509 certificate relies on ... ...
- Machine Learning Summary (2)
- klayout--导出版图为gds文件
猜你喜欢
3.1-分类-概率生成模型
Distributed Lock-Redission - Cache Consistency Solution
装饰器模式:Swift 实现
Redis source code-String: Redis String command, Redis String storage principle, three encoding types of Redis string, Redis String SDS source code analysis, Redis String application scenarios
我的创作纪念日丨感恩这365天来有你相伴,不忘初心,各自精彩
【LeetCode】Summary of linked list problems
1.1-回归
1081 Check Password (15 points)
4.1-支持向量机
1091 N-Defensive Number (15 points)
随机推荐
tf.reduce_mean() and tf.reduce_sum()
2.1-梯度下降
tf.cast(), reduce_min(), reduce_max()
我的创作纪念日丨感恩这365天来有你相伴,不忘初心,各自精彩
pyqt5实现仪表盘
数据库无法启动,报无法分配内存,怎么处理
为什么会没有内存了呢
TF generates (feature, label) set through feature and label, tf.data.Dataset.from_tensor_slices
项目2-年收入判断
兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04
2.1 - Gradient Descent
matplotlib
C Primer Plus(6) 中文版 第1章 初识C语言 1.1 C语言的起源 1.2 选择C语言的理由 1.3 C语言的应用范围
go-grpc TSL authentication solution transport: authentication handshake failed: x509 certificate relies on ... ...
1071 小赌怡情 (15 分)
CSDN21天学习挑战赛——封装(06)
2022-08-10 mysql/stonedb-slow SQL-Q16-time-consuming tracking
无服务器+域名也能搭建个人博客?真的,而且很快
Redis source code: how to view the Redis source code, the order of viewing the Redis source code, the sequence of the source code from the external data structure of Redis to the internal data structu
Active users of mobile banking grew rapidly in June, hitting a half-year high