題目描述:
給定長度小於100的一個字符串,區分大小寫的情況下統計其中字母的個數,並按照由大到小的順序輸出.當字母個數一樣時,按照把先出現的字母放在前面.當字符串中沒有字母時,則不要輸出.
舉例:
輸入:
abbbdcdc123
輸出:
b=3
d=2
c=2
a=1
1 #include <iostream> 2 #include <string> 3 #include <set> 4 #include <vector> 5 #include <algorithm> 6 using namespace std; 7 8 //答題思路: 9 /* 10 首先統計出總共有多少個不同的字母; 11 對不同的字母,用二維vector記錄其個數(初始化為0)以及首次出現的位置(初始化為-1); 12 遍歷整個字符串,對個數和首次位置進行更新; 13 對vector基於個數和首次位置進行排序(冒泡法) 14 */ 15 16 int main() 17 { 18 string str; 19 while (cin >> str) 20 { 21 set<char> setInt; 22 //這里用set來剔除重復的,還有更好的方法嗎? 23 for (int i = 0; i < str.size(); i++) 24 { 25 if (str[i] >= 'A' && str[i] <= 'z') 26 { 27 setInt.insert(str[i]); 28 } 29 } 30 31 cout << endl; 32 for (set<char>::iterator it = setInt.begin(); it != setInt.end(); it++) 33 { 34 cout << " " << *it; 35 } 36 cout << endl; 37 38 //把set轉成vector來操作,set的玩的不熟. 39 vector<char> vec0; 40 for (set<char>::iterator it = setInt.begin(); it != setInt.end(); it++) 41 { 42 vec0.push_back(*it); 43 } 44 45 vector<vector<int>> vec2; 46 vector<int> vec1; 47 int nOutSize = vec0.size(); 48 int nInnerSize = 3; 49 50 for (int j = 0; j < nInnerSize; j++) 51 { 52 vec1.push_back(-1); 53 } 54 for (int k = 0; k < nOutSize; k++) 55 { 56 vec2.push_back(vec1); 57 vec2[k][0] = vec0[k]; //第一列存字符,第二列存個數,第三列存首次位置. 58 vec2[k][1] = 0; 59 } 60 61 for (int k = 0; k < nOutSize; k++) 62 { 63 for (int j = 0; j < nInnerSize; j++) 64 { 65 cout << " " << vec2[k][j]; 66 } 67 cout << endl; 68 } 69 cout << endl; 70 71 for (int i = 0; i < str.size(); i++) 72 { 73 for (int j = 0; j < vec0.size(); j++) 74 { 75 if (str[i] == vec2[j][0]) 76 { 77 if (vec2[j][2] == -1) 78 { 79 vec2[j][2] = i; 80 } 81 vec2[j][1]++; 82 } 83 } 84 } 85 86 for (int k = 0; k < nOutSize; k++) 87 { 88 for (int j = 0; j < nInnerSize; j++) 89 { 90 cout << " " << vec2[k][j]; 91 } 92 cout << endl; 93 } 94 cout << endl; 95 96 for (int i = 0; i < nOutSize-1; i++) 97 { 98 for (int j = i + 1; j < nOutSize; j++) 99 { 100 if (vec2[i][1] < vec2[j][1]) 101 { 102 vec2[i].swap(vec2[j]); //兩個vector之間交換 103 } 104 else if (vec2[i][1] == vec2[j][1]) 105 { 106 if (vec2[i][2] > vec2[j][2]) 107 { 108 vec2[i].swap(vec2[j]); 109 } 110 } 111 } 112 } 113 114 for (int k = 0; k < nOutSize; k++) 115 { 116 for (int j = 0; j < nInnerSize; j++) 117 { 118 cout << " " << vec2[k][j]; 119 } 120 cout << endl; 121 } 122 cout << endl; 123 124 for (int k = 0; k < nOutSize; k++) 125 { 126 //轉成字符類型 127 cout << (char)vec2[k][0] << "=" << vec2[k][1] << endl; 128 } 129 } 130 }
輸入:
abbbdcdc123
輸出:
a b c d
97 0 -1
98 0 -1
99 0 -1
100 0 -1
97 1 0
98 3 1
99 2 5
100 2 4
98 3 1
100 2 4
99 2 5
97 1 0
b=3
d=2
c=2
a=1