新浪云服務器做網(wǎng)站瀏覽器廣告投放
前言:
🎯個人博客:Dream_Chaser
🎈博客專欄:C++
📚本篇內容:僅僅反轉字母、字符串中的第一個唯一字母、字符串最后一個單詞的長度、驗證回文串、字符串相加
目錄
917.僅僅反轉字母?
題目描述:
387.字符串中的第一個唯一字符
題目描述:
HJ1 字符串最后一個單詞的長度
輸入描述:
輸出描述:
125.驗證回文串
題目描述:
415.字符串相加
題目描述:
917.僅僅反轉字母?
題目鏈接:917. 僅僅反轉字母 - 力扣(LeetCode)
題目描述:
給你一個字符串?s
?,根據(jù)下述規(guī)則反轉字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小寫或大寫)位置反轉。
返回反轉后的?s
?。
題目示例:
題目思路:
?使用begin和end兩個指針,開始時begin指向字符串開頭,end指針指向字符串末尾(’\0’的前一個字符)。當兩指針同時指向字母時,應該立即進行交換,接著begin++,end--。若其中一個遇到非字母或者兩個指針同時遇到非字母,則跳過該字符,進行對應的++,-- 操作,重復上述步驟。當begin>end循環(huán)結束,返回 s .
起始圖:
動態(tài)過程:?
結果圖:
代碼:
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;}//進行字母間的交換swap(s[begin],s[end]);++begin;--end;}return s;}
};
387.字符串中的第一個唯一字符
題目鏈接:387. 字符串中的第一個唯一字符 - 力扣(LeetCode)
題目描述:
給定一個字符串?s
?,找到?它的第一個不重復的字符,并返回它的索引?。如果不存在,則返回?-1
?。
示例:
思路:
????????使用一個大小為26個int的數(shù)組countA(因為只有26個字母)統(tǒng)計字符串 s 中每個字母出現(xiàn)的次數(shù),然后再遍歷一次字符串,找到第一個唯一字符(字符串中只有這一個只出現(xiàn)一次,并且它是第一個,即使后面有唯一字符,也是返回第一個出現(xiàn)的字符),返回它在該字符串 s 中的索引,若找不到則返回-1。
class Solution {
public:int firstUniqChar(string s) {//計算這個字符串某個字符出現(xiàn)次數(shù)的數(shù)組int countA[26] = {0};//范圍for統(tǒng)計出字符串中每個元素出現(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 字符串最后一個單詞的長度
題目鏈接:字符串最后一個單詞的長度_??皖}霸_??途W(wǎng) (nowcoder.com)
題目描述:
計算字符串最后一個單詞的長度,單詞以空格隔開,字符串長度小于5000。(注:字符串末尾不以空格為結尾)
輸入描述:
輸入一行,代表要計算的字符串,非空,長度小于5000。
輸出描述:
輸出一個整數(shù),表示輸入字符串最后一個單詞的長度。
示例:
圖解:
#include <iostream>
using namespace std;
#include<string>
int main()
{string str;getline(cin,str);//不要使用cin>>line,因為會它遇到空格就結束了size_t i =str.rfind(' ');//找到此字符串的最后一個空格的位置if(i != string::npos)//等于則表示“未找到”或者“超出范圍”{cout<<str.size() - (i+1)<<endl;}else//字符串沒有空格,則計算整個字符串的大小{cout<<str.size()<<endl;}
}
125.驗證回文串
題目鏈接:125. 驗證回文串 - 力扣(LeetCode)
題目描述:
如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數(shù)字字符之后,短語正著讀和反著讀都一樣。則可以認為該短語是一個?回文串?。
字母和數(shù)字都屬于字母數(shù)字字符。
給你一個字符串?s
,如果它是?回文串?,返回?true
?;否則,返回?false
?。
題目示例:
解題思路:
? ? ? ? 先寫一個判斷是否為字母和數(shù)字的函數(shù),然后寫一個判斷回文數(shù)的函數(shù),先用范圍for遍歷這個字符串,將所有小寫字母變成大寫字母(為什么不用大寫轉小寫呢?)看下面解釋:
將所有小寫字母轉換成大寫后,此時定義begin指向字符串的開頭,end則指向字符串結尾('\0'的前一個位置),循環(huán)條件是begin < end,此時遍歷字符串,begin向右移動,end向左移動,如果遇到 空格,以及其他非數(shù)字非字母的字符則直接跳過。
????????之后,如果兩指針此時指向的字符不一樣(因為前面已經(jīng)小寫轉大寫)則直接返回false,如果相同依舊是begin++,end--,當遍歷完字符串時,則說明此字符串為回文字符串,返回true。
代碼:
class Solution {
public://判斷是否是字母,數(shù)字,是返回true,否則為falsebool isLetterOrNumber(char ch){return (ch>='0' && ch<='9')|| (ch>='a' && ch<='z')|| (ch>='A' && ch<='Z');}//確保在后續(xù)比較時,無論是大寫還是小寫字母,都被視為相同的字符//這樣做的好處在于,當判斷字符串是否為回文串時,我們不需要區(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)
題目描述:
給定兩個字符串形式的非負整數(shù)?num1
?和num2
?,計算它們的和并同樣以字符串形式返回。
你不能使用任何內建的用于處理大整數(shù)的庫(比如?BigInteger
),?也不能直接將輸入的字符串轉換為整數(shù)形式。
題目示例:
代碼:?
class Solution {
public:string addStrings(string num1, string num2) {int end1=num1.size()-1,end2=num2.size()-1;string str;//進位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;//進位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
🧭更新時間:2024年4月7日?