2016-11-09 3 views
0

Titel sagt alles - Meine Zeichenkette wird nur durch die Ziffern gebildet, die durch Leerzeichen, z. 1 0 3 0 4 0 7 0. Ich möchte das am häufigsten vorkommende Zeichen entfernen und dann 1 3 4 7 erhalten. Es wird immer nur eine Ziffer geben, die wiederholt wird. Ich habe versucht, diese aber es entfernt nur die Duplikate, nicht das tatsächliche Auftreten des Charakters:Das häufigste Zeichen aus einer Zeichenkette entfernen - C++

string newString = "1 0 3 0 4 0 7 0"; 
sort(newString.begin(), newString.end()); 
newString.erase(unique(newString.begin(), newString.end()), newString.end()); 

ich auch von Zeichen in einer Schleife über die Zeichenfolge versucht habe und dann die, zu entfernen, die am meisten vorkommenden, aber es doesn 't Arbeit:

void countCharacters(const char n[], char count[]) 
{ 
int c = 0; 
while (n[c] != '\0') 
    { 
    if (n[c] >= '0' && n[c] <= '9') 
     count[n[c] - '0']++; 
    } 
} 

void myFunction() 
{ 
string newString = "1 0 3 0 4 0 7 0"; 
char count[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
const char *charString = newString.c_str(); 
countCharacters(charString, count); 
for (unsigned int z = 0; z < strlen(charString); z++) 
     { 
      if (count[z] > 1) 
       { 
       newString.erase(remove(newString.begin(), newString.end(), count[z]), newString.end()); 
       } 
     } 
} 

Jede Hilfe würde geschätzt werden! :)

Antwort

0

Versuchen Sie diesen Code

void solve() { 
string s = "1 0 3 0 4 0 7 0"; 
    int mx_count = 0, cnt[10] = {0}; 
    char mx_occ = '0'; 
    for(int i = 0; i < int(s.size()); i++) { 
    if('0' <= s[i] && s[i] <= '9') { 
     cnt[s[i] - '0']++; 
     if(cnt[s[i] - '0'] > mx_count) 
     mx_count = cnt[s[i] - '0'], mx_occ = s[i]; 
    } 
    } 
    queue<int> idxs; 
    for(int i = 0; i < int(s.size()); i++) { 
    if(!('0' <= s[i] && s[i] <= '9')) continue; 
    if(s[i] == mx_occ) idxs.push(i); 
    else { 
     if(!idxs.empty()) { 
     int j = idxs.front(); 
     idxs.pop(); 
     swap(s[i], s[j]); 
     idxs.push(i); 
     } 
    } 
    } 
    // instead of the below while loop 
    // you can loop on the queue and 
    // erase the chars at the positions in that queue. 

    int i = int(s.size()) - 1; 
    while(i >= 0 && (!('0' <= s[i] && s[i] <= '9') || s[i] == mx_occ)) { 
    --i; 
    } 
    if(i >= 0) s = s.substr(0, i + 1); 
    else s = ""; 
    cout << s << "\n"; 
} 
0

Nachdem Sie Ihre Zeichenfolge deklarieren:

string newString = "1 0 3 0 4 0 7 0"; 

Sie können eine Anweisung ersetzen verwenden (eine Funktion, die die häufigste Auftreten für Sie, wenn Sie würde gerne)

newString = newString.replace(" 0", " "); 

Wenn Sie eine Funktion verwenden möchten, um Ihnen zu sagen, welches Zeichen das ist am häufigsten, dann können Sie das in das erste Argument der Replace-Funktion einfügen.

Lassen Sie mich wissen, ob dies hilft!

+0

Vielen Dank für Ihre schnelle Antwort! Ich habe es tatsächlich herausgefunden - ich habe meine Funktion implementiert, um den Charakter zu finden, der am häufigsten vorkommt, aber jetzt habe ich ein anderes Problem: Ich habe vergessen zu erwähnen, dass meine Zeile so sein kann: – JavaNewb

Verwandte Themen