永发信息网

c/c++编程:将字符串按重复次数从多到少的顺序输出 示例 helloworld 输出:llloohewrd

答案:3  悬赏:80  手机版
解决时间 2021-01-27 10:29
  • 提问者网友:最爱你的唇
  • 2021-01-26 15:20
c/c++编程:将字符串按重复次数从多到少的顺序输出 示例 helloworld 输出:llloohewrd
最佳答案
  • 五星知识达人网友:迟山
  • 2021-01-26 16:41
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <functional>
using namespace std;

struct Node
{
Node(char _c,int _cou):ch(_c),count(_cou)
{

}
char ch;//字符标记
int count;//字符出现的次数
};

//自定义比较运算符
inline bool operator > (const Node & r,const Node &l)
{
return (r.count>l.count);
}

bool not_exit(char ch,const vector<Node> &v);
void change_str(const char * str);

int main()
{
change_str("helloworld");
return 0;
}

void change_str(const char * str)
{
size_t len=strlen(str);
vector<Node> v;
char tmp;
int c=0;

//以Node型为单元,统计字符出现的次数
for(int i=0;i!=len;++i)
{
tmp=str[i];
for(int j=0;j!=len;++j)
{
if(tmp==str[j])
c++;
}

if(not_exit(tmp,v))
{
Node n(tmp,c);
v.push_back(n);
}
c=0;
}

//以字符出现的次数为关键字排序
sort(v.begin(),v.end(),greater<Node>());

for(size_t i=0;i!=v.size();++i)
{
for(int k=0;k!=v[i].count;++k)
cout<<v[i].ch;
}

cout<<endl;
}

bool not_exit(char ch,const vector<Node> &v)
{
for(size_t i=0;i!=v.size();++i)
{
if(ch==v[i].ch)
return false;
}
return true;

}
算法的复杂度不好,是比较笨的办法O(n*n)
全部回答
  • 1楼网友:慢性怪人
  • 2021-01-26 17:32
代码如下: #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; #include &lt;vector&gt; #include &lt;functional&gt; using namespace std; struct node { node(char _c,int _cou):ch(_c),count(_cou) { } char ch;//字符标记 int count;//字符出现的次数 }; //自定义比较运算符 inline bool operator &gt; (const node &amp; r,const node &amp;l) { return (r.count&gt;l.count); } bool not_exit(char ch,const vector&lt;node&gt; &amp;v); void change_str(const char * str); int main() { change_str("helloworld"); return 0; } void change_str(const char * str) { size_t len=strlen(str); vector&lt;node&gt; v; char tmp; int c=0; //以node型为单元,统计字符出现的次数 for(int i=0;i!=len;++i) { tmp=str[i]; for(int j=0;j!=len;++j) { if(tmp==str[j]) c++; } if(not_exit(tmp,v)) { node n(tmp,c); v.push_back(n); } c=0; } //以字符出现的次数为关键字排序 sort(v.begin(),v.end(),greater&lt;node&gt;()); for(size_t i=0;i!=v.size();++i) { for(int k=0;k!=v[i].count;++k) cout&lt;&lt;v[i].ch; } cout&lt;&lt;endl; } bool not_exit(char ch,const vector&lt;node&gt; &amp;v) { for(size_t i=0;i!=v.size();++i) { if(ch==v[i].ch) return false; } return true; } 算法的复杂度不好,是比较笨的办法o(n*n)
  • 2楼网友:时间的尘埃
  • 2021-01-26 17:09
定义两组数组变量 然后从第一个字符开始读取,存入第一组数组变量1,并让赋值1给第二组数组变量1 读第二个字符,并与数组变量1比较,如果相同,则让第二组数组变量1的值加1, 与此类推。 最后用冒泡法给第二组数组由大到小排列。 然后以第二组数名给第一组排列即可。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯