字串內特殊字元處理‘#’‘@’
阿新 • • 發佈:2018-12-27
//問題描述
/*
輸入一個字串,裡面包含特殊字元‘@’‘#’,對每個字串作如下處理
1. 如果遇到‘@’,則刪除‘@’之前的所有字元(包括‘@’)
2. 如果遇到‘#’,則刪除‘#’之前的一個字元(包括‘#’)
/*
輸入一個字串,裡面包含特殊字元‘@’‘#’,對每個字串作如下處理
1. 如果遇到‘@’,則刪除‘@’之前的所有字元(包括‘@’)
2. 如果遇到‘#’,則刪除‘#’之前的一個字元(包括‘#’)
*/
//問題分析:
最直接的辦法,遍歷整個字串,遇到‘@’‘#’再做相應處理,處理可以是直接刪除,但需要注意的是,如果直接刪除,刪除會改變字串大小,遍歷字串則應該注意。或者是將這些字元標記為不可用,但這需要對整個字串重新遍歷一次。
int main() { int T; cin >> T; for (int kase = 0; kase < T; kase++) { string str; cin >> str; for (int i = 0; i < str.length();) { if (str[i] == '#') { if ((i - 1) >= 0) //要判斷‘#’字元是否為第一個字元 { str.erase(i - 1, 2); i = i - 1; } else { str.erase(i, 1); } continue; } if (str[i] == '@') { str.erase(0, i+1); i = 0; continue; } i++; } cout << str << endl; } return 0; }
採用標記字元的方法:
void delSpecialChar(string str) { int len = str.length(); int * flag = new int[len]; for (int i = 0; i < len; i++) { flag[i] = 1; } for (int i = 0; i < len; i++) { if (str[i] == '@') { for (int j = 0; j <= i; j++) { flag[j] = 0; } } if (str[i] == '#') { if (i != 0) { flag[i-1] = 0; } flag[i] = 0; } } for (int i = 0; i < len; i++) { if (flag[i]) cout << str[i]; } }