C语言 LeetCode题目 判断回文数bool类型

定义一个布尔函数判断输入的数字是不是回文数

题目:给你一个整数 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;
  }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值