leetcode Palindrome Number

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

click to show spoilers.

 

Subscribe to see which companies asked this question

 

蛮简单的,先得到位数,然后得到最后一位和第一位进行比对就行了。

后面一个知识,一道牛客的题,我在对-2147483648进行abs发现还是负数,就有后面题的解析。

这道题只要是负数就不是palindrome。

 1 class Solution {
 2 public:
 3     bool isPalindrome(int x) {
 4         if(x==0) return true;
 5         if(x<0) return false;
 6         int front=0,back=0;
 7         int count=0,temp=x;
 8         while(temp>0){count++;temp/=10;}
 9         cout<<count<<endl;
10         for(int i=count;i>0;){
11             temp=pow(10,i-1);
12             back=x%10;
13             front=x/temp;
14             cout<<temp<<endl<<back<<" "<<front<<endl;
15             if(back==front) {x=x%temp;x/=10;i=i-2;}
16             else return false;
17         }
18          return true;
19     }  
20 };

 

 


 

那个你经常用的abs函数(取绝对值)真的总是返回非负数吗?

  前几天在牛客网看到一道关于abs()函数返回值的题目,见下图,当时还没反应过来,第一反应是:自从我开始学C语言,就知道它是用来求int数的绝对值的,返回值当然是0或者正数啊,一看答案就是A。

 

  后来思来想去,质问自己 难道这道题就这么简单?于是果断先查函数库,得到:

#include <stdlib.h> //或math.h
int abs( int num );

  发现库函数的返回值形式都写的是int,为什么是int?经过深入的思考、验证和查阅资料,最后得出:

当num为0或正数时,函数返回num值;
当num为负数且不是最小的负数时(即0x80000000),函数返回num的对应绝对值数,即将内存中该二进制位的符号位取反,并把后面数值位取反加一;
当num为最小的负数时,由于正数里int类型32位表示不了这个数的绝对值,所以依然返回该负数。
  贴上代码运行结果:
      
  也就是说,对于普通程序员来说,直接用abs来求一个数的绝对值并没有想象中那么安全,如果恰好给它传递了一个最小的负数作为参数,得到的依然是这个负数,而不是它的绝对值,也许后面将会发生各种意想不到的情况。因此,每一位程序员都应该明白:调用函数后检查函数返回值是一个优秀程序员应该具备的基本素养。
posted @ 2015-12-08 11:18  0giant  阅读(230)  评论(0编辑  收藏  举报