# String Manipulation# Character Mapping

c054 - 10082 - WERTYU

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入字串中的每個字元替換為鍵盤上其左側的字元。鍵盤佈局如題目所述,QWERTYUIOP、ASDFGHJKL、ZXCVBNM 分別為三行,1234567890-= 為第一行。空白字元保持不變。

解題思路

程式碼使用多個字串來表示鍵盤的每一行。對於輸入字串中的每個字元,程式碼遍歷鍵盤的每一行,檢查該字元是否在該行中。如果在某一行中找到該字元,則將其替換為該行中左側的字元。對於特殊情況,例如 'q' 替換為 ']','a' 替換為 ''','z' 替換為 '/',程式碼也進行了處理。

複雜度分析

  • 時間複雜度: O(N * M),其中 N 是輸入字串的長度,M 是鍵盤行數(固定為 4)。
  • 空間複雜度: O(1),程式碼使用的額外空間是固定的,不隨輸入大小變化。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	string a={"`1234567890-="};
	string b={"QWERTYUIOP[]\\"};
	string c={"ASDFGHJKL;'"};
	string d={"ZXCVBNM,./"};
	string e;
	while(getline(cin,e)){
		for(int i=0;i<e.length();i++){
			for(int j=0;j<a.length();j++){
				if(e[i]=='`')
					e[i]='`';
				else if(e[i]==a[j])
					e[i]=a[j-1];
			}
			for(int j=0;j<b.length();j++){
				if(e[i]=='q')
					e[i]=']';
				else if(e[i]==b[j])
					e[i]=b[j-1];
			}
			for(int j=0;j<c.length();j++){
				if(e[i]=='a')
					e[i]='\'';
				else if(e[i]==c[j])
					e[i]=c[j-1];
			}
			for(int j=0;j<d.length();j++){
				if(e[i]=='z')
					e[i]='/';
				else if(e[i]==d[j])
					e[i]=d[j-1];
			}
		}
		cout << e << "\n";
	}
}

Discussion