前言:
??個(gè)人博客:Dream_Chaser
??博客專欄:C++
??本篇內(nèi)容:僅僅反轉(zhuǎn)字母、字符串中的第一個(gè)唯一字母、字符串最后一個(gè)單詞的長度、驗(yàn)證回文串、字符串相加
目錄
917.僅僅反轉(zhuǎn)字母?
題目描述:
387.字符串中的第一個(gè)唯一字符
題目描述:
HJ1 字符串最后一個(gè)單詞的長度
輸入描述:
輸出描述:
125.驗(yàn)證回文串
題目描述:
415.字符串相加
題目描述:
917.僅僅反轉(zhuǎn)字母?
題目鏈接:917. 僅僅反轉(zhuǎn)字母 - 力扣(LeetCode)
題目描述:
給你一個(gè)字符串?s
?,根據(jù)下述規(guī)則反轉(zhuǎn)字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小寫或大寫)位置反轉(zhuǎn)。
返回反轉(zhuǎn)后的?s
?。
題目示例:
題目思路:
?使用begin和end兩個(gè)指針,開始時(shí)begin指向字符串開頭,end指針指向字符串末尾(’\0’的前一個(gè)字符)。當(dāng)兩指針同時(shí)指向字母時(shí),應(yīng)該立即進(jìn)行交換,接著begin++,end--。若其中一個(gè)遇到非字母或者兩個(gè)指針同時(shí)遇到非字母,則跳過該字符,進(jìn)行對應(yīng)的++,-- 操作,重復(fù)上述步驟。當(dāng)begin>end循環(huán)結(jié)束,返回 s .
起始圖:
動態(tài)過程:?
結(jié)果圖:
代碼:
class Solution {
public:
bool isLetter(char ch)
{
if(ch>= 'A' && ch<='Z')
return true;
if(ch>='a' && ch<='z')
return true;
return false;
}
string reverseOnlyLetters(string s) {
int begin = 0,end=s.size()-1;
while(begin<end)
{
//先寫出判斷條件,避免越界問題,再判斷是否為字母
//遇到非字母跳過
while(begin<end && !isLetter(s[begin]))
{
++begin;
}
while(begin<end && !isLetter(s[end]))
{
--end;
}
//進(jìn)行字母間的交換
swap(s[begin],s[end]);
++begin;
--end;
}
return s;
}
};
387.字符串中的第一個(gè)唯一字符
題目鏈接:387. 字符串中的第一個(gè)唯一字符 - 力扣(LeetCode)
題目描述:
給定一個(gè)字符串?s
?,找到?它的第一個(gè)不重復(fù)的字符,并返回它的索引?。如果不存在,則返回?-1
?。
示例:
思路:
????????使用一個(gè)大小為26個(gè)int的數(shù)組countA(因?yàn)橹挥?6個(gè)字母)統(tǒng)計(jì)字符串 s 中每個(gè)字母出現(xiàn)的次數(shù),然后再遍歷一次字符串,找到第一個(gè)唯一字符(字符串中只有這一個(gè)只出現(xiàn)一次,并且它是第一個(gè),即使后面有唯一字符,也是返回第一個(gè)出現(xiàn)的字符),返回它在該字符串 s 中的索引,若找不到則返回-1。
class Solution {
public:
int firstUniqChar(string s) {
//計(jì)算這個(gè)字符串某個(gè)字符出現(xiàn)次數(shù)的數(shù)組
int countA[26] = {0};
//范圍for統(tǒng)計(jì)出字符串中每個(gè)元素出現(xiàn)的次數(shù)
for(auto ch : s)
{
countA[ch - 'a']++;//映射其在字母表中的位置
}
for(int i =0;i<s.size();i++)
{
if(countA[s[i] - 'a'] == 1)//找到s中第一次出現(xiàn)的字母
{
return i;//返回其索引
}
}
return -1;//找不到
}
};
HJ1 字符串最后一個(gè)單詞的長度
題目鏈接:字符串最后一個(gè)單詞的長度_牛客題霸_??途W(wǎng) (nowcoder.com)
題目描述:
計(jì)算字符串最后一個(gè)單詞的長度,單詞以空格隔開,字符串長度小于5000。(注:字符串末尾不以空格為結(jié)尾)
輸入描述:
輸入一行,代表要計(jì)算的字符串,非空,長度小于5000。
輸出描述:
輸出一個(gè)整數(shù),表示輸入字符串最后一個(gè)單詞的長度。
示例:
圖解:
#include <iostream>
using namespace std;
#include<string>
int main()
{
string str;
getline(cin,str);//不要使用cin>>line,因?yàn)闀龅娇崭窬徒Y(jié)束了
size_t i =str.rfind(' ');//找到此字符串的最后一個(gè)空格的位置
if(i != string::npos)//等于則表示“未找到”或者“超出范圍”
{
cout<<str.size() - (i+1)<<endl;
}
else//字符串沒有空格,則計(jì)算整個(gè)字符串的大小
{
cout<<str.size()<<endl;
}
}
125.驗(yàn)證回文串
題目鏈接:125. 驗(yàn)證回文串 - 力扣(LeetCode)
題目描述:
如果在將所有大寫字符轉(zhuǎn)換為小寫字符、并移除所有非字母數(shù)字字符之后,短語正著讀和反著讀都一樣。則可以認(rèn)為該短語是一個(gè)?回文串?。
字母和數(shù)字都屬于字母數(shù)字字符。
給你一個(gè)字符串?s
,如果它是?回文串?,返回?true
?;否則,返回?false
?。
題目示例:
解題思路:
? ? ? ? 先寫一個(gè)判斷是否為字母和數(shù)字的函數(shù),然后寫一個(gè)判斷回文數(shù)的函數(shù),先用范圍for遍歷這個(gè)字符串,將所有小寫字母變成大寫字母(為什么不用大寫轉(zhuǎn)小寫呢?)看下面解釋:
將所有小寫字母轉(zhuǎn)換成大寫后,此時(shí)定義begin指向字符串的開頭,end則指向字符串結(jié)尾('\0'的前一個(gè)位置),循環(huán)條件是begin < end,此時(shí)遍歷字符串,begin向右移動,end向左移動,如果遇到 空格,以及其他非數(shù)字非字母的字符則直接跳過。
????????之后,如果兩指針此時(shí)指向的字符不一樣(因?yàn)榍懊嬉呀?jīng)小寫轉(zhuǎn)大寫)則直接返回false,如果相同依舊是begin++,end--,當(dāng)遍歷完字符串時(shí),則說明此字符串為回文字符串,返回true。
代碼:
class Solution {
public:
//判斷是否是字母,數(shù)字,是返回true,否則為false
bool isLetterOrNumber(char ch)
{
return (ch>='0' && ch<='9')
|| (ch>='a' && ch<='z')
|| (ch>='A' && ch<='Z');
}
//確保在后續(xù)比較時(shí),無論是大寫還是小寫字母,都被視為相同的字符
//這樣做的好處在于,當(dāng)判斷字符串是否為回文串時(shí),我們不需要區(qū)分大小寫
//在忽略空格并統(tǒng)一字母大小寫后,其回文性更容易判斷
bool isPalindrome(string s)//判斷是否是回文數(shù)
{
for(auto&ch :s){
if(ch>='a' && ch<= 'z')
{
ch -= 32;
}
}
int begin = 0, end = s.size()-1;
while(begin<end)
{
//遇到非字母和數(shù)字則跳過
while(begin < end && !isLetterOrNumber(s[begin]))
{
++begin;
}
while(begin < end && !isLetterOrNumber(s[end]))
{
--end;
}
if(s[begin] != s[end])
{
return false;
}
else
{
++begin;
--end;
}
}
return true;
}
};
415.字符串相加
題目鏈接:415. 字符串相加 - 力扣(LeetCode)
題目描述:
給定兩個(gè)字符串形式的非負(fù)整數(shù)?num1
?和num2
?,計(jì)算它們的和并同樣以字符串形式返回。
你不能使用任何內(nèi)建的用于處理大整數(shù)的庫(比如?BigInteger
),?也不能直接將輸入的字符串轉(zhuǎn)換為整數(shù)形式。
題目示例:
代碼:?
class Solution {
public:
string addStrings(string num1, string num2) {
int end1=num1.size()-1,end2=num2.size()-1;
string str;
//進(jìn)位
int next= 0;
while(end1>= 0 || end2>=0)
{
int x1 = end1 >=0 ? num1[end1]-'0' : 0;
int x2 = end2 >=0 ? num2[end2] -'0': 0;
int ret = x1 + x2 +next;
//進(jìn)位
next = ret/10;
ret= ret%10;
//頭插
str.insert(0,1,'0'+ret);
--end1;
--end2;
}
if(next ==1)
str.insert(0,1,'1');
return str;
}
};
本篇完。
??本文修改次數(shù):0文章來源:http://www.zghlxwxcb.cn/news/detail-845308.html
??更新時(shí)間:2024年4月7日?文章來源地址http://www.zghlxwxcb.cn/news/detail-845308.html
到了這里,關(guān)于【C++初階】String在OJ中的使用(一):僅僅反轉(zhuǎn)字母、字符串中的第一個(gè)唯一字母、字符串最后一個(gè)單詞的長度、驗(yàn)證回文串、字符串相加的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!