• LeetCode_09 回文数【数学】


    题目描述

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

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

    示例

    输入: 121
    输出: true

    输入: -121
    输出: false

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

    输入: 10
    输出: false

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

    知识点

    • 回文数
    • 数字反转(数学解法)
    • 整数转化为字符串

    整数&字符串转化

    • string转int的方式:
      采用标准库中atoi函数。
    string s = "12"; 
    int a = atoi(s.c_str()); 
    
    • int转string
      采用标准库中的to_string函数。
    int i = 12; 
    cout << std::to_string(i) << endl; 
    

    解法

    思路一 反转一半数组(数学解法)

    说明:此题和第7题不同之处在于,7题需要完全反转整个数字,而本题只需要反转一半。
    这样做的好处是:不用溢出检验。
    

    算法流程

    • 1、处理一些临界情况
    a.所有负数都不可能是回文,如-123
    b.如果数字的最后一位是0,但他本身不是0的时候,因为不可能有0220,如:10
    
    • 2、将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。
    • 3、比较反转一半的数字和剩下的原始数字,如果相等(例如1221),或者反转一半的数字/10==剩下的原始数字(例如:12321)

    第3条的解释 给出的循环条件是剩下的原始数字x>反转后的数字rev,所以跳出循环的条件就是:

    1. x=rev
    2. x<rev

    第一种情况,直接就是回文数;

    例子:1221,x=12,rev=12,即为回文数
    

    第二种情况,需要判断rev/10=x

    例子:12321,x=12,rev=123,rev/10=12,即为回文数
    

    代码

    #include <iostream>
    using namespace std;
    class Solution {
    public:
          bool isPalindrome(int x) {
            int rev = 0;//rev记载倒置后的数字
            //检验临界情况:负数不是回文数,末尾是0但不等于0的不是回文数
            if (x < 0||(x % 10 == 0 && x != 0)) return false;
            //原始数字x小于反转后的数字rev
            while (x>rev) {
                int pop = x % 10;//pop记录x的个位数
                x /= 10;//去掉个位数   
                rev = rev * 10 + pop;//把pop记录的个位数赋值给temp
            }
            //比较得出是否是回文数
             return rev==x||rev/10==x;
    
        }
    };
    
    int main() {
        Solution solution;
    
        cout << solution.isPalindrome(-123) << endl;
        cout << solution.isPalindrome(10) << endl;
        cout << solution.isPalindrome(12321) << endl;
    }
    
    
    
    

    思路二 转化成字符串

    参考链接
    https://blog.csdn.net/single6/article/details/82318175

    (未实践)

  • 相关阅读:
    武汉科技大学ACM :1004: 零起点学算法74——Palindromes _easy version
    武汉科技大学ACM :1003: 零起点学算法14——三位数反转
    武汉科技大学ACM :1002: 零起点学算法38——求阶乘和
    武汉科技大学ACM :1001: 零起点学算法34——继续求多项式
    cos实现文件上传--推荐
    文件夹分级保存文件
    apache_fileupload实现文件上传_上传多个文件
    UEFI模式下安装Win 7系统
    武汉科技大学ACM :1008: A+B for Input-Output Practice (VIII)
    武汉科技大学ACM :1007: A+B for Input-Output Practice (VII)
  • 原文地址:https://www.cnblogs.com/zhuomoyixia/p/12397506.html
Copyright © 2020-2023  润新知