从字符串中删除最常见的字符 - C ++

时间:2016-11-09 16:48:03

标签: string character

标题说明了一切 - 我的字符串只能由以空格分隔的数字形成,例如1 0 3 0 4 0 7 0.我想要做的是删除最常出现的字符然后得到1 3 4 7.总会有一个数字重复。我尝试了这个,但它只删除了重复项,而不是实际出现的字符:

#content {
    display: flex;
    width: 80%;
    max-width: 1300px;
    min-width: 900px;
    margin: 80px auto;
}
#stream {
    position: relative;
    padding-bottom: 56.25%;
    height: 0;
    overflow: hidden;
    width: 100%;
    height: auto;
    display: flex;
}
#video {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}
#chatbox {
    height: inherit;
}

我还试图按字符循环字符串,然后删除最常出现的字符串,但它不起作用:

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

任何帮助将不胜感激! :)

2 个答案:

答案 0 :(得分:0)

试试此代码

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";
}

答案 1 :(得分:0)

声明字符串后:

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

您可以使用替换语句(如果您愿意,可以使用可以找到最常见事件的函数)

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

如果您想使用函数来告诉您哪个字符最常见,那么您将能够将其放入替换函数的第一个参数中。

请告诉我这是否有帮助!