leetcode009

第一次使用leetcode,感觉特别棒,跟着群里的人刷题。
此为刷题报告
开始


题目:

Determine whether an integer is a palindrome. Do this without extra space.

释义

判断一个整数是不是回文数

补充描述

负整数是回文吗? (即,-1)
如果你想将整数转换为字符串,请注意使用额外空间的限制。
你也可以尝试反转整数。 但是,如果您已解决了“反向整数”的问题,则知道反向整数可能会溢出。 你将如何处理这种情况?
有一个更通用的方法来解决这个问题。

思路:

首先的思路就是字符串,用string对象,迭代器很容易遍历,比较首尾字符是否相等,问题是首先将int转换成string,要经过一个函数的操作,这个函数我还没弄懂,直接从网上找的代码。群里人家说不能用string或者vector,额外空间的限制,这一点一直没搞明白
看了几篇博客,说是用%和/的方法取出每一位。注意负数不是回文数,取出每一位是没有意义的,记住回文数是从前和从后都是一个数,于是从后读数,如果和从前一样就相等。更多细节代码注释!

问题:

还有几点没搞明白
- 额外空间如何理解
- 反转整数为什么会溢出?
- 其他人家通用方法


代码

 int getbit(int x)
{
    int n=1;
    while(x>=10)
    {
    x=x/10;
    n*=10;
    }
    return n;
}
 bool isPalindrome(int x)
{
    int s=0,n=0,t=x;
    if(x>=0)
    {
        n=getbit(x);  
       while(x>0)
       {
        s=s+((x%10)*n);
        x=x/10;
        n=n/10;
       }
       if(s==t)
        return true;
    }
    return false;//待注释
} 


之前犯规用字符串写的代码:

代码2:此为看了答案之后把我的代码合并成一个函数

 bool isPalindrome(int x)
{
    int s=0,n=1,t=x;  
    while(x>=10)
    {
        x=x/10;
        n*=10;
    }//求出第一位是哪个位,例如12321就是10000
    x=t;//x重新赋值初始值
    if(x<0) return false;//负数不是回文数,直接返回false
        while(x>0)
       {
        s=s+((x%10)*n);
        x=x/10;
        n=n/10;
       }//例如12321,取得最后一位乘以10000,接下来取得下一位2乘以1000,依次类推
        if(s==t)//重新构造的数和之前的数相等,ture
        return true; 
        return false;否则false
}

优秀的AC

 bool isPalindrome(int x) {  
  if (x < 0) return false;  
  int div = 1;  
  while (x / div >= 10) {  
    div *= 10;  
  }  //这个代码块很好        
  while (x != 0) {  
    int l = x / div;//取出第一位
    int r = x % 10; //取出最后一位 
    if (l != r) return false; //对应的位置不等则不是回文数 
    x = (x % div) / 10;  
    div /= 100;  
  }  //程序只要循环比较少的次数,比较完就去除12321变成232,确实很奇妙
  return true;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值