• 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来求一个数的绝对值并没有想象中那么安全,如果恰好给它传递了一个最小的负数作为参数,得到的依然是这个负数,而不是它的绝对值,也许后面将会发生各种意想不到的情况。因此,每一位程序员都应该明白:调用函数后检查函数返回值是一个优秀程序员应该具备的基本素养。
  • 相关阅读:
    Struts tags--Data tags
    Java NIO学习笔记七 Non-blocking Server
    Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel
    Java NIO学习笔记五 FileChannel(文件通道)
    Java NIO学习笔记四 NIO选择器
    Java NIO学习笔记 三 散点/收集 和频道转换
    SpringMVC接收集合页面参数
    JAVA NIO学习笔记二 频道和缓冲区
    Java NIO学习笔记一 Java NIO概述
    通过举例了解java中的流
  • 原文地址:https://www.cnblogs.com/LUO77/p/5028521.html
Copyright © 2020-2023  润新知