01串排序

01串排序算法实现
题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序。
 
输入描述:输入数据中含有一些01串,01串的长度不大于256个字符。
 
输出描述:重新排列01串的顺序,使得串按题目描述的方式排序。
 
题目分析:
 
(1)定义一个多重集合容器,该容器的元素类型为string,采用设定的比较函数
 

(2)因为元素是string而非结构体,所以可以编写比较函数,重载“()”操作符。对于参与比较的每两个字符串,若他们长度不同,则按长度由小到大返回;若他们长度相同,则计算每个字符串中‘1’的个数,若‘1’的个数不同,则按‘1’的个数从少到多返回;若‘1’的个数相同,则按ASCII码值,即字符串的大小从小到大返回。

参考代码:

<span style="font-size:18px;">#include <fstream>

#include <iostream>

#include <string>

#include <set>

#include <algorithm>

 

using namespace std;

 

struct Comp

{

    bool operator()(const string &s1,const string &s2)

    {

        if(s1.length()!=s2.length()) return s1.length()<s2.length();

        int c1=count(s1.begin(),s1.end(),'1');

        int c2=count(s2.begin(),s2.end(),'1');

        return (c1!=c2?c1<c2:s1<s2);

    }

};

 

int main(int argc,char * argv[])

{

    multiset<string,Comp> ms;

    string s;

    while(cin>>s)

    {

        ms.insert(s);

        if(cin.get()=='\n')

        {

            break;

        }

    }

    for(multiset<string,Comp>::iterator it=ms.begin();it!=ms.end();it++)

    {

        cout<<*it<<endl;

    }

    system("pause");

    return 0;

}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值