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)
#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 <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)
- 2楼网友:时间的尘埃
- 2021-01-26 17:09
定义两组数组变量
然后从第一个字符开始读取,存入第一组数组变量1,并让赋值1给第二组数组变量1
读第二个字符,并与数组变量1比较,如果相同,则让第二组数组变量1的值加1,
与此类推。
最后用冒泡法给第二组数组由大到小排列。
然后以第二组数名给第一组排列即可。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯