1. 程式人生 > >Leetcode|Reverse Integer(string轉char*總結)

Leetcode|Reverse Integer(string轉char*總結)

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

解法1:
思路是轉化為字串。溢位的判斷要進行字串比較;這裡string型別不能直接用strcmp;如果想用的話,需要型別轉換。
下面我會說明到底怎麼比較字串。

int strcmp(const char str1, const char* str2);*
其中str1和str2可以是字串常量或者字串變數,返回值為整形。返回結果如下規定:
①str1小於str2,返回負值或者-1;
②str1等於str2,返回0;
③str1大於str2,返回正值或者1;
strcmp函式實際上是對字元的ASCII碼進行比較,實現原理如下:首先比較兩個字串的第一個字元,若不相等,則停止比較並得出兩個ASCII碼大小比較的結果;如果相等就接著比較第二個字元然後第三個字元等等。無論兩個字串是什麼樣,strcmp函式最多比較到其中一個字串遇到結束符’\0’為止,就能得出結果。


如果用strcmp,我們將string轉換為char .最好是const char.

string轉換為char* 有三種方法:
string tmp;
char p=(char)tmp.data();//不加char*問題不大。
char *p=tmp.c_str();
char p[15];tmp.copy(p,tmp.size(),0);p[tmp.size()]=0;//末尾加上’\0’; 下面題目的tmp長度不會超過10個。

直接用string的特性比較(兩種方法):
tmp.compare(“2147483649”);返回的是正數,負數和0;
tmp>”2147483649”;返回的true和false;
程式碼如下:

int reverse(int x) {
        string tmp;
        bool neg=x<0?true:false;
        unsigned int t=x<0?-x:x;//不能用long long 定義t,否則對於INT_MIN,去相反數仍然為INT_MIN,負號一直有。
        stringstream ss;
        for(;t!=0;t/=10){
            char tt=t%10+'0';
            ss<<tt;
        }
        tmp=ss.str();
        if
(tmp.size()==10&&(tmp.compare("2147483648")>0||(!neg&&tmp.compare("2147483647")>0))) return 0;//用compare函式 //remove zero int i=0; for(;tmp[i]=='0';i++); int res=0; for(;i<tmp.size();i++){ res=res*10+(tmp[i]-'0'); } return neg?-res:res; }

上題有兩點需要注意:
1,判斷溢位時候,比較字串,先確定長度是10。不然輸入123也返回0了。
2,INT_MIN變為正數的時候,用unsigned int.

解法2:
直接在int下操作。無需轉換字串。注意溢位條件。
INT_MAX不能隨便減去一個負數,INT_MIN 也不能隨便減去一個正數。

int reverse(int x){
    int y=0;
    for(;x!=0;x/=10){
        int n=x%10;
        if(y>INT_MAX/10||y<INT_MIN/10) return 0;//減去n就溢位了
        y=y*10+n;
    }
    return y;
}

上面溢位條件其實應該是:
y*10+n>INT_MAX||y*10+n