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()操作是否一一对等。

猜你喜欢

转载自blog.csdn.net/weixin_39139505/article/details/88842851