leetcode-简单题-题序:9+13
leetcode-簡單題-題序:9+13
- 9.回文數(shù)
- 題目
- 知識點
- 解決過程
- 結(jié)果
- 難點
- 13. 羅馬數(shù)字轉(zhuǎn)整數(shù)
- 題目
- 知識點
- 解決過程
- 結(jié)果
- 難點
9.回文數(shù)
題目
判斷一個整數(shù)是否是回文數(shù)。回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)。
知識點
沒有什么知識點。
解決過程
先逆序存入一個數(shù)組,再把數(shù)組正序輸出來,得到某數(shù)值。比較原數(shù)值和該數(shù)值是否相等即可。
class Solution { public:bool isPalindrome(int x) {int a=x;if(x<0){return false;}int res[32];int i=0;long long y=0;while(x){res[i++]=x%10;x/=10;}for(int j=0;j<i;j++){y=y*10+res[j];}if(a==y)return true;else return false;} };結(jié)果
難點
- 跟第7題一樣,也是要考慮整型逆序的溢出問題。用long long類型就可以解決最終值無法判斷的問題。
13. 羅馬數(shù)字轉(zhuǎn)整數(shù)
題目
羅馬數(shù)字包含以下七種字符: I, V, X, L,C,D 和 M。
字符 數(shù)值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000例如, 羅馬數(shù)字 2 寫做 II ,即為兩個并列的 1。12 寫做 XII ,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。
通常情況下,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數(shù)字 1 在數(shù)字 5 的左邊,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 。同樣地,數(shù)字 9 表示為 IX。這個特殊的規(guī)則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給定一個羅馬數(shù)字,將其轉(zhuǎn)換成整數(shù)。輸入確保在 1 到 3999 的范圍內(nèi)。
知識點
一、字符串轉(zhuǎn)數(shù)組,strcpy()
string name = "哈哈哈哈"; char buf[] = {0}; strcpy(buf , name.c_str());//字符串轉(zhuǎn)字符數(shù)組,使用strcpy二、判斷字符串中包含子字符串
string a="abcdefghigklmn";string b="def";string::size_type idx;idx=a.find(b);//在a中查找b.if(idx == string::npos )//不存在。cout << "not found\n";else//存在。cout <<"found\n"; return 0;三、哈希表的表示方法,unordered_map
四、想從字符串中查找某個字符,直接按數(shù)組的形式進(jìn)行查找即可。
五、字符串的最后一個字符,s.back()
六、字符串刪除指定字符,erase()
解決過程
一、用數(shù)組把六種特殊情況存起來,如果遇到就加上這六種情況對應(yīng)的值,然后把遇到的情況刪掉,把剩下的加起來。
#include <string> class Solution { public:int romanToInt(string s) {unordered_map<string,int>mp;string exist[6]={"CM","CD","XL","XC","IV","IX"};int value[6]={900,400,90,40,9,4};for(int i=0;i<6;i++){mp[exist[i]]=value[i];}unordered_map<char,int>mpp;mpp['I'] = 1;mpp['V'] = 5;mpp['X'] = 10;mpp['L'] = 50;mpp['C'] = 100;mpp['D'] = 500;mpp['M'] = 1000;int res=0;string::size_type idx;for(int i=0;i<6;i++){idx=s.find(exist[i]);if(idx!=string::npos){res+=value[i];s.erase(exist[i]);}}//剩下的這些都是正常的for(int j=0;j<s.size();j++){res+=mpp[s[j]];}return res;}} };
erase()出現(xiàn)問題。字符串可能因為封裝問題,
二、查題解得,如果前一個數(shù)小于后一個數(shù)的話,就得到前一個數(shù)的相反數(shù);其他情況,則加上前一個數(shù)本身。
class Solution { public:int romanToInt(string s) {unordered_map<char, int> mp;mp['I'] = 1;mp['V'] = 5;mp['X'] = 10;mp['L'] = 50;mp['C'] = 100;mp['D'] = 500;mp['M'] = 1000;int pos = 0, neg = 0;for (int i = 0;i < s.size()-1;++i){if (mp[s[i]] < mp[s[i+1]])neg -= mp[s[i]];elsepos += mp[s[i]];}pos += mp[s.back()];return pos + neg;} };結(jié)果
難點
總結(jié)
以上是生活随笔為你收集整理的leetcode-简单题-题序:9+13的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode-简单题-题序:1+7
- 下一篇: 创新实训团队记录:为BR-MTC问题设计