【牛客-算法】NC56 回文数字

导读:本篇文章讲解 【牛客-算法】NC56 回文数字,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

🚩 前言

🔥 该专栏作为算法题笔记,记录算法的思路、遇到的问题,以及能跑的代码,持续更新中!
🔥 推荐一款面试、刷题神器牛客网:👉开始刷题学习👈


1.题目描述

  • 原题链接NC56 回文数字

  • 描述
    在不使用额外的内存空间的条件下判断一个整数是否是回文。
    回文指逆序和正序完全相同。

  • 数据范围

    2

    31

    n

    2

    31

    1

    -2^{31} \le n \le 2^{31}-1

    231n2311
    进阶: 空间复杂度

    O

    (

    1

    )

    O(1)

    O(1),时间复杂度

    O

    (

    l

    e

    n

    (

    n

    )

    )

    O(len(n))

    O(len(n))

  • 提示
    负整数可以是回文吗?(比如 – 1)
    如果你在考虑将数字转化为字符串的话,请注意一下不能使用额外空间的限制
    你可以将整数翻转。但是,如果你做过题目“反转数字”,你会知道将整数翻转可能会出现溢出的情况,你怎么处理这个问题?

2.算法设计思路

  • if(数字是负数)
    • 不回文
  • else if(反转后的数字与原数字相等)
    • 回文

如何反转一个整数呢?参见:【牛客-算法】NC57 反转数字

3.算法实现(C语言)

 #include<limits.h>


int reverse(int x ) {
    //反转数字,对于超出范围的情况,将返回0
    if(x == INT_MIN)//INT_MIN取相反数运算,数将不变
    {
        return 0;
    }

    int t = x;//备份

    bool big = false;//x的数量级是否为10亿
    if(x > 1000000000)
    {
        big = true;
    }
    
    int f = 1;//f数量级指向首位,e数量级指向末位;将向中间迭代
    int e = 1;
    while(x / f / 10 > 0) //得到x首位的数量级
    {
        f *= 10;
    }

    while(f > e)
    {
        int fNum = x / f % 10;//得到首、末位数字
        int eNum = x / e % 10;
        x = x - f * fNum + f * eNum;//交换数字
        x = x - e * eNum + e * fNum;
        f /= 10;//向中间迭代
        e *= 10;
    }

    int eNum = t % 10;
    if(big && (eNum > 2 || (eNum != 0 && x < 1000000000)))//反转后溢出
    {
        return 0;
    }

    return x;
}

bool isPalindrome(int x ) {
    //是否回文
    bool result = false;
    if(x >= 0){
        int x2 = reverse(x);
        if(x == x2){
            result = true;
        }
    }
    return result;
}

4.运行结果

在这里插入图片描述


🧭 结束语:

今天的分享就到这里啦,快来一起刷题叭!
👉开始刷题学习👈


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114783.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!