j922 - 英文字母的大小寫
題目描述
題目要求將輸入的一段英文文字轉換成四種不同的格式:全大寫、全小寫、句首大寫其餘小寫,以及標題大小寫(每個單字首字母大寫,其餘小寫)。
解題思路
程式首先讀取輸入字串。然後,它執行以下步驟:
- 找出第一個字母的位置,用於後續的句首大寫轉換。
- 將所有大寫字母轉換為小寫字母。
- 複製原始字串到四個不同的字串變數,分別用於儲存四種格式的輸出。
- 將第一個字母轉換為大寫字母(句首大寫)。
- 遍歷字串,如果遇到小寫字母,且該字母是單字的第一個字母(前一個字元不是字母),則將其轉換為大寫字母(標題大小寫)。
- 將所有字母轉換為小寫字母(全小寫)。
- 輸出四個格式化的字串。
複雜度分析
- 時間複雜度: O(n),其中 n 是輸入字串的長度。程式需要遍歷字串多次,但每次遍歷都是線性時間。
- 空間複雜度: O(n),程式複製了原始字串到三個額外的字串變數,因此空間複雜度與輸入字串的長度成正比。
程式碼
#include <iostream>
using namespace std;
int fr=-1,oft='a'-'A';
string s,a,c,d;
int main(){
getline(cin,s);
for(int i=0;i<s.size();++i){
if(s[i]!=' '&&fr==-1)fr=i;
if(s[i]>='A'&&s[i]<='Z'){
s[i]+=oft;
}
}
a=d=c=s;
a[fr]-=oft;
for(int i=0;i<s.size();++i){
if(s[i]>='a'&&s[i]<='z'){
if(i==0||!((s[i-1]>='a'&&s[i-1]<='z')||(s[i-1]>='A'&&s[i-1]<='Z'))){
c[i]-=oft;
}
s[i]-=oft;
}
}
cout << a << "\n" << s << "\n" << c << "\n" << d;
}