1.把字符串轉(zhuǎn)換成整數(shù)
傳送門
題目詳情
代碼
class Solution {
public:
int StrToInt(string str) {
int flag=1;
long long ret=0;
string::iterator it=str.begin();
// 處理空字符串的情況
if (it == str.end())
{
return 0;
}
// 處理符號(hào)
if (*it == '-')
{
flag = -1;
++it;
} else if (*it == '+')
{
++it;
}
// 遍歷字符串,將每個(gè)字符轉(zhuǎn)換為數(shù)字并累加到結(jié)果中
while (it != str.end()) {
if (*it >= '0' && *it <= '9')
{
ret = ret * 10 + (*it - '0');
++it;
} else
{
return 0;
}
}
// 根據(jù)符號(hào)返回最終結(jié)果
return flag * ret;
}
};
思路
-
首先處理空字符串為空的情況()
-
再處理第一個(gè)字符可能為
+
-
的情況,直接定一個(gè)flag
初始化為1,遇到-
就賦值為-1 -
接下來(lái)就利用迭代器進(jìn)行循環(huán),如果是字符數(shù)字就直接使用
ret = ret * 10 + (*it - '0');
是其他字符,直接return 0;了
2. 344.反轉(zhuǎn)字符串
傳送門
題目詳情
代碼1
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
}
};
思路1
大家學(xué)習(xí)了c++,可能直接就想到了。但是我們刷題還是盡量會(huì)本質(zhì)
代碼2
class Solution {
public:
void reverseString(vector<char>& s) {
//reverse(s.begin(),s.end());
int left=0;
int right=s.size()-1;
while(left<right)
{
swap(s[left],s[right]);
left++;
right--;
}
}
};
思路
還是老朋友啦:使用雙指針?lè)?,進(jìn)行交換,直到相遇
3. 387. 字符串中的第一個(gè)唯一字符
傳送門
題目詳情
代碼
class Solution {
public:
int firstUniqChar(string s) {
int arr[26]={0};
int index=0;
char singal='0';
//不會(huì)出現(xiàn)空字符
for(auto e:s)
{
arr[e-'a']++;
}
//再次遍歷string,而不是arr
for(int i=0;i<s.size();i++)
{
if(arr[s[i]-'a']==1)
{
return i;
}
}
return -1;
}
};
思路
利用計(jì)數(shù)排序的思想,利用一個(gè)數(shù)組
- 我們看到,這個(gè)字符串只會(huì)出現(xiàn)小寫字母,我們就定義一個(gè)整型數(shù)組
arr[26]
:0處是a,1處是b…,25處是z- 先把string給遍歷一遍,這里是使用了范圍for:哪個(gè)字母出現(xiàn)一此,就使用
arr[e-'a']++;
來(lái)進(jìn)行自增,現(xiàn)在出現(xiàn)一次的字母對(duì)應(yīng)在數(shù)組里的值是1,兩次是2- 有時(shí)有多個(gè)出現(xiàn)一次的字母,我們需要返回的是第一個(gè)
所以還是從string開(kāi)始遍歷,為了返回第一個(gè)(我一開(kāi)始因?yàn)閺腶rr開(kāi)始遍歷,一直不能通過(guò))
4. 917. 僅僅反轉(zhuǎn)字母
傳送門
題目詳情
代碼
class Solution {
public:
bool isLetter(char ar)
{
if((ar>='A'&&ar<='Z')||(ar>='a'&&ar<='z'))
{
return true;
}
return false;
}
string reverseOnlyLetters(string s) {
//仿照快排一次的思想
int left=0;
int right=s.size()-1;
while(left<right)
{
//右側(cè)先行
while(left<right&&!isLetter(s[right]))//找字母才停
{
right--;
}
while(left<right&&!isLetter(s[left]))//找字母
{
left++;
}
swap(s[left],s[right]);
right--;
left++;
}
return s;
}
};
思路
使用雙指針的方法,類似于快速排序中的一次劃分。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-816430.html
- 具體來(lái)說(shuō),維護(hù)了兩個(gè)指針(下標(biāo)) left 和 right,它們分別指向字符串的開(kāi)頭和結(jié)尾。
- 然后,你使用 while 循環(huán)來(lái)不斷移動(dòng)這兩個(gè)指針,并在遇到字母時(shí)進(jìn)行交換。當(dāng) left 指向的字符不是字母時(shí),left 指針向右移動(dòng);當(dāng) right 指向的字符不是字母時(shí),right 指針向左移動(dòng)。
- 一旦找到了兩個(gè)位置上的字母,就交換它們的位置。最終,當(dāng) left 和 right 指針相遇時(shí),整個(gè)字符串就完成了反轉(zhuǎn)
今天就到這里啦!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-816430.html
到了這里,關(guān)于c++:string相關(guān)的oj題(把字符串轉(zhuǎn)換成整數(shù)、344.反轉(zhuǎn)字符串、387. 字符串中的第一個(gè)唯一字符、917. 僅僅反轉(zhuǎn)字母)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!