| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2097 人关注过本帖
标题:如何将一个字符串顺序化?
只看楼主 加入收藏
复旦
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:81
专家分:124
注 册:2018-10-29
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:12 
如何将一个字符串顺序化?
比如有几个字符串
s[0]="awervd";
s[1]="ethbvasdf";
...
然后按照英语字母的顺序把每个字符串顺序化之后得到
s[0]="adervw";
s[1]="abdefhst";
...

想这样做的话,要怎么做?

谢谢!
搜索更多相关主题的帖子: 字符串 顺序 英语 字母 
2018-11-12 02:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
size_t buf[] = {};
for( …… )
    ++buf[ s[i] ];

for( buf )
    打印出 buf[i] 个i;
2018-11-12 09:14
复旦
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:81
专家分:124
注 册:2018-10-29
收藏
得分:0 
好像您没正确理解了我的意思。
我的意思是怎么把每一个字符串顺序化。
比如EDASB变成ABDES。
您写的代码是输出同样字符串的个数吧。
2018-11-12 12:15
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
收藏
得分:0 
程序代码:
#include <iostream>
#include<cstring>
#include <set>

using namespace std;

int main()
{
    char *s = "ethbvasdfbbcca";

    multiset<char> ms;

    //将所有的字符插入到容器中
    for(int i = 0; i < strlen(s); i++)
        ms.insert(s[i]);

    //输出
    for(char c : ms)
        cout << c << " ";
    cout << endl;

    //或者利用迭代器输出
    multiset<char>::iterator it = ms.begin();

    while(it != ms.end()){
        cout << *it << "-";
        it++;
    }
    cout << endl;

    return 0;
}


可以利用STL的set容器来实现,set容器自动排序

multiset 和 set都是自动排序的,前者允许重复的元素,后者不允许

若需要不重复的,把multiset<char> ms; 改成 set<char> ms; 即可

[此贴子已经被作者于2018-11-12 12:27编辑过]

2018-11-12 12:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
以下是引用复旦在2018-11-12 12:15:08的发言:

好像您没正确理解了我的意思。
我的意思是怎么把每一个字符串顺序化。
比如EDASB变成ABDES。
您写的代码是输出同样字符串的个数吧。

补充完整,你再看看
程序代码:
#include <iostream>
#include <string>
#include <climits>


std::string foo( const std::string& s )
{
    size_t buf[ CHAR_MAX-CHAR_MIN+1 ] = {};
    for( size_t i=0; i!=s.size(); ++i )
        ++buf[ s[i]-CHAR_MIN ];

    std::string r;
    for( size_t i=0; i!=sizeof(buf)/sizeof(*buf); ++i ) // sizeof(buf)/sizeof(*buf) 可以直接写成 std::size(buf)
        r += std::string( buf[i], i+CHAR_MIN );
    return r;
}

int main( void )
{
    std::cout << foo("awervd") << std::endl;
    std::cout << foo("ethbvasdf") << std::endl;
}

2018-11-12 12:55
复旦
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:81
专家分:124
注 册:2018-10-29
收藏
得分:0 
感谢两位大佬的指教。
rjsp大佬,可以简单说明一下您写的代码吗?  size_t buf之类的,看不懂。
rohalloway大佬,用您的办法的时候遇到了一些问题。 字符串利用muiltiset<char>之前怎么转换成char然后输入到容器里面?

#include "stdafx.h"
#include <string>
#include <set>
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

void sortStr (string* strp,int length)
{
    multiset<char> ms;
    char* p;
    for (int i=0;i<length;i++)
    {
        p=(char*)strp.c_str();
        ms.insert((char)strp[i]);
    }
    multiset<char>::iterator iter = ms.begin();
    for (int i=0;i<length;i++)
    {
        *(strp+i)=*iter;
        iter++;
    }
}



int main()
{
    string s[5];
    string * strp;
    int length;
    s[0]="asdfa";
    s[1]="awefscv";
    s[2]="awefascv";
    s[3]="tyjfbs";
    s[4]="mryutfnd";
   
    for (int i=0;i<5;i++)
    {
        strp=&s[0];
        length=s[0].length();
        sortStr(strp,length);
        cout << s[i] << endl;
    }

    system("pause");
    return 0;
}

转换char的时候出错。
2018-11-12 21:58
复旦
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:81
专家分:124
注 册:2018-10-29
收藏
得分:0 
rjsp大佬,还有个问题。
您写的代码在linux vim编辑器里写了然后用g++编译的时候报错,说CHAR_MAX,CHAR_MIN,buf没有定义。
我里面写了 #include<string>  #inlcude <map> using namespace std;
这是为什么呢?
谢谢!
2018-11-12 22:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
您写的代码在linux vim编辑器里写了然后用g++编译的时候报错,说CHAR_MAX,CHAR_MIN,buf没有定义。
你把 代码 及 编译器给出的错误信息 贴出来。
(我给出的代码本身就通过了g++的测试,我实在奇怪为什么你拷贝粘贴一下到你那儿就不行了)

我里面写了 #include<string>  #inlcude <map> using namespace std;
这是为什么呢?
你问错人了吧,我给你的代码中没有“#inlcude <map>”,而是
#include <iostream>
#include <string>
#include <climits>

2018-11-13 08:39
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
收藏
得分:10 
程序代码:
#include <iostream>
#include<cstring>
#include <set>
#include <string>

using namespace std;

string sortStr(const string str)
{
    multiset<char> ms;
    string value;
    
    //将所有的字符插入到容器中
    for (int i = 0; i < str.length(); i++)
        ms.insert(str[i]); //str的元素就是char

    for (char c : ms)
        value += c;

    return value;
}

int main()
{
    string s = "ethbvasdfbbcca";

    cout << sortStr(s);

    return 0;
}
2018-11-13 10:18
复旦
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:81
专家分:124
注 册:2018-10-29
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

2018-11-13 16:21
快速回复:如何将一个字符串顺序化?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018188 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved