定义一个布尔函数判断输入的数字是不是回文数
题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
以下是源代码:
bool isPalindrome(int x) {
if (x < 0)
return false;
int m = x, n = 10;
int digit = 1; // 表示一个数字的位数,至少有一位
while (m / n != 0) // 若能满足除以十不为零,那就说明这个数字在十位以上
{
digit++;
m = m / 10;
}//收集到了digit,为x的位数
//从二分的角度来看
int half_digit = digit / 2;
//尝试把数字放入数组里面
int* p = (int*)malloc(digit * sizeof(int));//建立一个digit位的数组
/*编译器检测到了对指针p申请内存可能失败,这就造成后面的程序出bug,
所以我们要检验以下p是否为NULL指针,如果不是NULL指针,那就危险了!*/
if (*p == NULL)
{
p = 0;
}
//把数字存入数组
int i = 0;
for (n = 10, m = x; i < digit; i++, m /= 10)
{
p[i] = m % 10;
}
for (i = 0; i < half_digit; i++)
{
if (p[i] != p[digit - 1 - i])
{
return false;
}
}
free(p);
return true;
}
思路重点:
1.负数不是回文数,所以在一开始就列出这一条件,可以减少时间复杂度
2.这个题目我之前做过,那时候还没有学指针和动态规划。这一次我将数字放入数组中,(正序和倒序不重要),然后判断是否对称。
3.使用malloc函数给指针申请内存,如果申请成功,那它就是一个NULL指针。这时候要考虑到如果内存没有申请成功,那这个指针连空指针都不算,要及时给它赋值,不然会出bug。
使用bool类型需要用到头文件<stdbool.h>
做完之后提交上去是没问题的
执行用时:
12 ms, 在所有 C 提交中击败了46.28%的用户
内存消耗:
6.7 MB, 在所有 C 提交中击败了5.01%的用户
然后我查看了示例代码,好简洁!
其中有一个思想我没考虑到:将x倒过来存放到另一个变量中,若两个变量相等,则x是回文数
bool isPalindrome(int x) {
if (x < 0)
return false;
int m = x, n = 10;
int digit = 1; // 表示一个数字的位数,至少有一位
while (m / n != 0) // 若能满足除以十不为零,那就说明这个数字在十位以上
{
digit++;
m = m / 10;
}//收集到了digit,为x的位数
//尝试把数字放入数组里面
int* p = (int*)malloc(digit * sizeof(int));//建立一个digit位的数组
/*编译器检测到了对指针p申请内存可能失败,这就造成后面的程序出bug,
所以我们要检验以下p是否为NULL指针,如果不是NULL指针,那就危险了!*/
if (*p == NULL)
{
p = 0;
}
//把数字存入数组
int i = 0;
for (n = 10, m = x; i < digit; i++, m /= 10)
{
p[i] = m % 10;//此时在数组中,x已经倒置了
}
int c = 0;
for (i = 0; i < digit; i++)
{
c = c * 10 + p[i];
}
if (c == x)
return true;
else
return false;
free(p);
}
将所有注释去掉之后:
执行用时:
8 ms, 在所有 C 提交中击败了74.85%的用户
内存消耗:
6.5 MB, 在所有 C 提交中击败了5.01%的用户
最后附上简洁的示例代码
bool isPalindrome(int x){
long int a,b;
b=x;
long int c=0;
if(x<0)
{
return false;
}
else{
while(b!=0)
{
a=b%10;
b=b/10;
c=c*10+a;
}
return c==x;
}
}