leetcode Palindrome Number
Determine whether an integer is a palindrome. Do this without extra space.
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来求一个数的绝对值并没有想象中那么安全,如果恰好给它传递了一个最小的负数作为参数,得到的依然是这个负数,而不是它的绝对值,也许后面将会发生各种意想不到的情况。因此,每一位程序员都应该明白:调用函数后检查函数返回值是一个优秀程序员应该具备的基本素养。