示例 1:
输入: 121
输出: true 示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。 进阶:
你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-number 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
又见到回文了,不过这一次不是字符串,而是数。这道题目的难度是简单,那么就让我们来解解看吧。
首先构建函数头,输入时一个 int,输出是bool,很简单
public bool IsPalindrome(int x)
然后考虑解法,题目里有讲尽量不将整数转为字符串来解决这个问题,那么既然是简单难度的题目,咱们也就自己给自己提高一些难度(转化为字符串的解法可以参考前面的文章,最长回文子串中对于回文串的判断的代码)。
首先看题目,示例2与 示例 3 中的两种情况我们可以直接排除这些数字来节约运算时间
if (x < 0) //负数
{
return false;
}
if (x % 10 == 0) //个位为0
{
return false;
}
然后我们考虑在数值类型的情况下如何判断回文数。
首先我们考虑如何将数字进行反转,这就想到了我们之前做过的整数反转那道题,通过逐次除10取余的方式取出最低位的数值。并且考虑到回文数的情况,只要处理到一半(一旦新建的逐步升位数字大于降位数字,即可停止计算,返回false)。我们可以将代码构建如下
public bool IsPalindrome(int x)
{
if (x == 0) //为0 由于0的情况无法在后续循环中判断,故在此提前判断
{
return true;
}
if (x < 0) //负数
{
return false;
}
if (x % 10 == 0) //个位为0
{
return false;
}
int temp = 0;
while (x > 0)
{
if (temp == x) //类似1221这类回文情况在此处判断
{
return true;
}
int rem = x % 10;
x = x / 10;
if (temp == x) //类似121这类回文情况在此处判断
{
return true;
}
temp = temp * 10 + rem;//更新temp
}
return false;
}
非常简单的代码,运行一下
执行用时 :72 ms, 在所有 C# 提交中击败了92.07%的用户
内存消耗 :15.2 MB, 在所有 C# 提交中击败了81.40%的用户