leetcode回文数c++

回文数

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

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

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

分析:如果写了前面的整数反转题目,那么这题就会好写很多,基本思想都可以从整数反转那边套用过来。
传送门:整数反转

回文数的特点:

  • 负数不是回文数
  • 回文数反转不会溢出
  • 回文数前半部分数字和后半部分数字反转后大小相同

解法1:转换成字符串进行操作

class Solution {
public:
    bool isPalindrome(int x) {
 	long rev;	
	if (x < 0) return false;//排除负数
        string str_x = to_string(x);//转换成字符串
 	std::reverse(str_x.begin(), str_x.end());//进行反转
 	stringstream out(str_x);
 	out >> rev;//结果写入rev
	return x==rev;//比较得出结果
    }
};

解法2:

class Solution {
public:
    bool isPalindrome(int x) {
     int midrev=0;//存储后半部分数字的反转结果
     if (x < 0||(x%10==0&&x!=0)) return false;//排除负数和最后一位数字为0的数字
        while(x>midrev)
        {
            midrev=midrev*10+x%10;
            x/=10;
        }
     return midrev==x||midrev/10==x;//数字个数为偶数和奇数分两种情况
    }
};

解法3:

分析:可以利用栈的特性,将数字的后半部分压入栈内,再一一弹出对比,为此我们需要获取整数的位数,创建一个栈。特别需要注意的是奇数位和偶数位操作的差别。

代码实现:

class Solution {
public:
    int get_length(int x){//获取整数位数
     int leng=0;
     while(x)
        {
            x/=10;
            leng++;
        }
        return leng;
    }
    bool isPalindrome(int x) {
        if(x<0 ||(x%10==0&&x!=0)) return false;
        stack<int> mystack;//创建一个栈
        int l=get_length(x);//存放整数位数
        int p=0;//存放弹出的数据
        if(l%2==0)//偶数位操作
        {
            for(int i=0;i<l/2;i++)
            {
                p=x%10;
                x/=10;
                mystack.push(p);
            }
            for(int j=l/2;j<l;j++)
            {
                p=x%10;
                x/=10;
                if(p==mystack.top())
                {
                    mystack.pop();
                    continue;
                }
                else return false;
            }
            return true;
        }
        else//奇数位操作
        {
            for(int i=0;i<=l/2;i++)
            {
                p=x%10;
                x/=10;
                mystack.push(p);
            }
            mystack.pop();
            for(int j=l/2+1;j<l;j++)
            {
                p=x%10;
                x/=10;
                if(p==mystack.top())
                {
                    mystack.pop();
                    continue;
                }
                else return false;
            }
            return true;
        }
    }
};

注:在使用栈过程中容易出错,特别注意stack.push()和stack.pop()操作是否一一对等。

觉得本文对你有帮助,点个赞噢谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈乐乐happy

觉得对你有用的话可以打赏打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值