給定一個長度不限的字串,請找出該字串中出現次數最多的那個字元,並打印出該字元及出現次數(C/C++版)
阿新 • • 發佈:2019-01-25
#include<iostream> using namespace std; /** * @brief findchar 給定一個長度不限的字串,請找出該字串中出現次數最多的那個字元,並打印出該字元及出現次數; 如果多個字元的出現次數相同,只打印首個字元;輸出字元的大小寫格式要與輸入保持一致,大小寫不敏感模式下,輸出字元的大小寫格式與該字元首次出現時 的大小寫格式一致。實現時無需考慮非法輸入。 * @param [in] st 輸入的字串 * @param [out] ch 出現次數最多的字元 * @param [out] cnt 出現次數最多的字元數 * @param [in] sensitive 是否大小寫敏感 * @return 是否獲取成功 */ bool findchar(const string& st, char* ch, int* cnt, bool issensitive=true){ bool ret = true; int table[52] = {0}; int max = 0, maxindex =0, index = -1; if(st.length() <= 0) return false; string str = st; for(unsigned int i=0; i<str.length(); i++) { if((str.at(i) <= 'Z') && (str.at(i) >= 'A') ) { index = static_cast<int>( str.at(i) - 'A'); table[index]++; } else if((str.at(i) <= 'z') && (str.at(i) >= 'a')){ index = static_cast<int>(str.at(i) - 'a') ; index += 26; table[index]++; } } if(issensitive) { for(int i=0; i<52;i++) { if(max < table[i]){ max = table[i]; maxindex = i; } } } else{ for(int i=0; i<26;i++) { table[i] = table[i] + table[i+26]; table[i+26] = 0; } for(int j=0; j<26; j++) { if(max < table[j]) { max = table[j]; } } for(unsigned int i=0; i<str.length();i++) { int cnt = -1; (str.at(i) > 'Z') ? (cnt = static_cast<int>(str.at(i) - 'a')) : \ ( cnt = static_cast<int>(str.at(i) - 'A') ); if(table[cnt] == max){ (str.at(i) > 'Z') ? (maxindex = 26 + cnt ) : (maxindex = cnt); break; } } } if((maxindex < 26) && (max>1) ) { *ch = maxindex + 'A'; *cnt = max; } else if((maxindex >= 26) && (max>1) ) { *ch = maxindex + 'a' - 26; *cnt = max; } else if(max==1){ *ch = str.at(0); *cnt = max; } return ret; } int main() { char ch = 0; int cnt = 0; string str = "SssssMaammmmmmmaAde"; if(findchar(str, &ch, &cnt, false)) cout << "ch: " << ch << " cnt: " << cnt << endl; else cout << "failed" << endl; }