让我们一起啃算法----回文数

回文数(Palindrome-Number)

这是一个比较简单的题目,题干如下:

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
  输入: 121
  输出: true
示例 2:
  输入: -121
  输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
  输入: 10
  输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
来源:力扣

解题思路

按照题目的定义: 负数一定不是回文数,并且 [0,9] 的数一定是回文数

其次,我们稍微延伸一下题目,如果判断一个字符串是否是回文字符串,我们会怎么做?常规思路就是设置两个指针 ij 分别指向字符串的第一个字符和最后一个字符,然后 指针 i 向后挪指针 j 向前挪,每挪动一次就比较 指针 i 指向的字符是否和指针 j 指向的字符相等。具体流程如下:

如上,那我们是不是可以沿用判断字符串是否是回文字符串的思路来判断数字呢?当然是可以的啦。

所以现在的问题变成了怎么拿到数字的第一位和最后一位?上一篇文章 让我们一起啃算法—-整数反转 我们知道了 一个数与10取模可以得到最后一位的值。那第一位的值如何得到呢?可以用如下方式:

假设目标数字是 3245,它是一个四位数,最小的四位数是1000,3245 / 1000 就可以拿到第一位的值即 3 。

拿到了第一位的值和最后的一位的值之后,我们只需要判断是否相等即可。

具体的代码实现

GO语言实现:

func isPalindrome(x int) bool {
    if x < 0 {
        return false
    }
    div := 1
    // 得到相应位数的最小值
    // 例如:3245,那么div的值就是1000
    for x / (div) >=  10 {
        div *= 10
    }
    for x != 0 {
        // 得到第一位的值
        left := x / div
        // 得到最后一位的值
        right := x % 10
        if left != right {
            return false
        }
        // 去掉第一位和最后一位
        // 例如:( 3245 - 3 * 1000 )/ 10 = 24
        x = (x - left * div) / 10

        // 因为去掉了两位,因此div也相应的调整
        div /= 100
    }
    return true
}

总结

每天进步一点点,加油!
算法教程项目,每天更新一题,点个 star 支持一下呀
https://github.com/wx-satellite/learning-a...

本作品采用《CC 协议》,转载必须注明作者和本文链接
三斤
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

转字符串,然后分成两份,翻转其中一份,对比!

4年前 评论
三斤和他的喵 (楼主) 4年前

file

4年前 评论
Imuyu 4年前
三斤和他的喵 (楼主) 4年前
function isPalindrome($num) {
    if ($num < 0) {
        return 0;
    }
    $div = 1;

    // 得到相应位数的最小值
    // 例如:3245,那么div的值就是1000
    while ($num / $div >= 10) {
        $div *= 10;
    }

    while ($num !== 0) {
        $left = (int)($num / $div);
        $right = $num % 10;

        if ($left !== $right) {
            return 0;
        }
        // 去掉第一位和最后一位
        // 例如:( 3245 - 3 * 1000 )/ 10 = 24
        $num = (int)(($num - $left * $div) / 10);

        // 因为去掉了两位,因此div也相应的调整
        $div = (int)($div / 100);
    }

    return 1;
}
echo isPalindrome(123); // ouput: 0
echo isPalindrome(121); // ouput: 1
echo isPalindrome(1221); // ouput: 1

模仿楼主的实现了一下,算法太依赖数学逻辑了,数学差的真的难学

4年前 评论
三斤和他的喵 (楼主) 4年前
captain2021 (作者) 4年前
三斤和他的喵 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!