国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

leetcode第八題 String to Integer (atoi)

2019-11-08 02:33:44
字體:
供稿:網(wǎng)友

題目要求: 1. 字串為空或者全是空格,返回0; 2. 字串的前綴空格需要忽略掉; 3. 忽略掉前綴空格后,遇到的第一個(gè)字符,如果是‘+’或‘-’號(hào),繼續(xù)往后讀;如果是數(shù)字,則開始處理數(shù)字;如果不是前面的2種,返回0; 4. 處理數(shù)字的過程中,如果之后的字符非數(shù)字,就停止轉(zhuǎn)換,返回當(dāng)前值; 5. 在上述處理過程中,如果轉(zhuǎn)換出的值超出了int型的范圍,就返回int的最大值或最小值。 我一開始的代碼如下:

int len=str.size();if(len==0) return 0;int i;int sign=1;int ans=0;for(i=0;str[i]==' ';i++); //為了讓for循環(huán)不影響后面的,在此加上了分號(hào)if(str[i]=='+'){ sign=1; i++;}else if(str[i]=='-'){ sign=-1; i++;}while(i<len&&str[i]>='0'&&str[i]<='9'){ ans=ans*10+str[i++]-'0'; if(ans*sign>=INT_MAX) return INT_MAX; if(ans*sign<=INT_MIN) return INT_MIN;}return ans*sign;

這樣做會(huì)報(bào)錯(cuò)。輸入是”2147483648”時(shí),輸出是“-2147483648”(正確結(jié)果是2147483647) 當(dāng)輸入為“2147483648”(INT_MAX+1),最后一次執(zhí)行ans=ans*10+str[i++]-‘0’之前ans=214748364,可是一執(zhí)行這一句話就產(chǎn)生了溢出。(后面那個(gè)自然也檢測(cè)不出來了) 對(duì)于int來說,2147483647+1=-2147483648,也就是214748364*10+8=-2147483648。 但是如果把a(bǔ)ns的定義從int改成long,就沒問題了。我也不知道是怎么回事。 查了下,sizeof(int)=sizeof(long)=4,sizeof(long long)=8;其能表示的最大數(shù)為2^31-1,最小的數(shù)是-2^31. 現(xiàn)在以8位的為例。(計(jì)算機(jī)中以補(bǔ)碼存儲(chǔ),所以下面都是補(bǔ)碼) 255 01111111 -256 10000000 -255 10000001 -1 11111111 0 00000000 所以就有 255+1=-256(溢出),-256-1=255(溢出) -1+1=0。 對(duì)于計(jì)算機(jī)來說,它在執(zhí)行加法計(jì)算的時(shí)候完全是按照補(bǔ)碼相加,而不用考慮正負(fù)號(hào),甚至都不用考慮溢出的問題。 回到正題,在認(rèn)識(shí)到上述問題后,我修改了while循環(huán)。

while(i<len&&str[i]>='0'&&str[i]<='9') { if(ans>INT_MAX/10||(ans==INT_MAX/10&&str[i]>'7')) return (sign==1)?INT_MAX:INT_MIN; ans=ans*10+str[i++]-'0'; }

也就是在執(zhí)行ans=ans*10+str[i++]-‘0’之前就著手檢查,而不是在溢出之后才檢查,那樣就晚了。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 航空| 永和县| 泽库县| 雷波县| 惠来县| 乐东| 喀喇| 百色市| 成武县| 磐安县| 秦安县| 来安县| 佛坪县| 新泰市| 清远市| 刚察县| 大港区| 克什克腾旗| 南皮县| 象山县| 金沙县| 德令哈市| 夏河县| 日喀则市| 太仆寺旗| 和田市| 广汉市| 大余县| 红桥区| 石台县| 高尔夫| 醴陵市| 安国市| 封开县| 乌审旗| 巴林左旗| 长春市| 奉贤区| 阜新市| 泊头市| 巧家县|