• 【LeetCode每日一题】2020.6.10 9.回文数


    9. 回文数

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

    示例:

    输入: 121
    输出: true

    输入: -121
    输出: false
    解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

    输入: 10
    输出: false
    解释: 从右向左读, 为 01 。因此它不是一个回文数。

    进阶:

    你能不将整数转为字符串来解决这个问题吗?

    分析:

    法1:如果将整数转换为字符串来解决这个问题,会非常简单,只需要对转换后的字符串进行一次遍历就可以了。而且只需要遍历一半的元素。

    法2:如果根据进阶的要求。我们可以对数字进行一半的翻转。我们求取数字的后一半的翻转。具体做法是,不断地对原数字x进行取余,得到的结果保存在变量reversed中。当在reversed < x时,继续循环,reversed * 10作为高一位,同时继续对x取余,加上余数作为低位。同时对x / 10。

    ​ 例如:对121进行上述操作,

    1. reversed = 1

      x = 12

    2. reversed = 1 * 10 + 2

      x = 1

    接着如何通过翻转后的数字来判断回文呢?对于偶数原数字,判断reversed == x即可。对于奇数数字,reversed最后会比x高一位,只需要reversed / 10 == x即可。因为中间的一位数字只有一个,不会影响回文序列。

    注意事项:

    ​ 有一些数我们是可以直接判断不能构成回文序列的。

    • 负数,由于存在负号。
    • 个位为0,且不为0的数。高位无法存在0。

    代码(Golang):

    // 法1
    func isPalindrome1(x int) bool {
        str := strconv.Itoa(x)
        n := len(str)
        for i := 0; i < n / 2 + 1; i++ {
            if str[i] != str[n - 1 - i] {
                return false
            }
        }
        return true
    }
    
    // 法2
    func isPalindrome2(x int) bool {
        if x < 0 || x % 10 == 0 && x != 0 {
            return false
        }
        reversed := 0
        for reversed < x {
            reversed = reversed * 10 + x % 10
            x /= 10
        }
        return reversed == x || reversed / 10 == x
    }
    

    小结:

    ​ 字符串解法非常简单,翻转数字的写法很有趣。

  • 相关阅读:
    浅入ABP(1):搭建基础结构的 ABP 解决方案
    浅入ABP(2):添加基础集成服务
    GDB 调试 .NET 程序实录
    浅入 ABP 系列(6):数据库配置
    浅入 ABP 系列(4):事件总线
    浅入 ABP系列(3):增加日志组件、依赖注入服务
    模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)
    RabbitMQ与Kafka选型对比
    .Net在Windows上使用Jenkins做CI/CD的那些事
    Tomcat乱码问题
  • 原文地址:https://www.cnblogs.com/enmac/p/13083145.html
Copyright © 2020-2023  润新知