问题标题: 酷町堂:4864的错误在哪?

0
0
戴墨晗
戴墨晗
初级守护
初级守护

小明最近学习了很多的排序算法。老师想检验一下他的水平,给他出了一道题目:现在有n个字符串(包含空格)需要进行排序,对每个字符串中的数字先按照顺序提取组成一个数字串,先按照数字串中各个数字的和从大到小排序,如果数字的和相同,再按照数字串的字典序从小到大排序,如果数字串的字典序相同,则按照原字符串的字典序从小到大进行排序。

#include<iostream>

#include<cstdio>

#include<cmath>

#include<cstring>

#include<string>

#include<algorithm>

using namespace std;

string s[1010];

int n;

int count(string x)

{

    int sum=0;

    for(int i=0; i<x.size(); i++)

    {

        if(x[i]>='0' && x[i]<='9')

        {

            sum+=(int)x[i]-48;

        }

    }

    return sum;

}

string sjc(string x)

{

    int cnt=0;

    string y;

    for(int i=0; i<x.size(); i++)

    {

        if(x[i]>='0' && x[i]<='9')

        {

            y[cnt]=x[i];

            cnt++;

        }

    }

    return y;

}

bool cmp(string x, string y)

{

    if(count(x) != count(y))

    {

        return count(x)>count(y);

    }

    if(count(x)==count(y))

    {

        return sjc(x)<sjc(y);

    }

    if(sjc(x)==sjc(y))

    {

        return x<y;

    }   

}

int main()

{

    cin>>n;

    getline(cin, s[0]);

    for(int i=1; i<=n; i++)

    {

        getline(cin, s[i]); 

    }

    sort(s+1, s+n+1, cmp);

    for(int i=1; i<=n; i++)

    {

        cout<<s[i]<<endl;

    }

return 0;

}


1
1
0
0
0
曹博扬
曹博扬
初级天翼
初级天翼

1.你 sjc函数里的有y[cnt]=x[i]改成y+=x[i]

2.cmp函数照我这种形式写

if(szh(x)!=szh(y))
        return szh(x)>szh(y);
    if(c(x)!=c(y))
        return c(x)<c(y);
    return x<y;

4864:有趣的排序3

Accepted:100分代码共享

曹博扬在2020-08-17 11:01:26追加了内容

因为你cmp函数的里面排序顺序有问题

曹博扬在2020-08-17 11:01:40追加了内容

因为你cmp函数的里面排序顺序有问题

0
黄馨琦
黄馨琦
初级守护
初级守护

 

  • string tq(string s){
  • string z;
  • for(int i=0;i<s.size();i++){
  • if(s[i]>='0'&&s[i]<='9') z=z+s[i];
  • }
  • return z;
  • }
  • int sz(string z){
  • int sum=0;
  • for(int i=0;i<z.size();i++){
  • if(z[i]>='0'&&z[i]<='9')
  • sum+=z[i]-'0';
  • }
  • return sum;
  • }
  • bool cmp(string x,string y){
  • if(sz(x)!=sz(y)) return sz(x)>sz(y);
  • else if(tq(x)!=tq(y)) return tq(x)<tq(y);
  • return x<y;
  • }
  • int main(){
  • int n;
  • cin>>n;
  • getline(cin,a[0]);
  • for(int i=1;i<=n;i++){
  • getline(cin,a[i]);
  • }
  • sort(a+1,a+n+1,cmp);
  • for(int i=1;i<=n;i++){
  • cout<<a[i]<<endl;
  • }
0
胡景波
胡景波
中级光能
中级光能
string count(string a){
    string t;
    for(int i=0;i<a.size();i++){
        if(a[i]>='0'&&a[i]<='9'){
            t+=a[i];
        }
    }
    return t;
}
int count2(string b){
    int cnt=0;
    for(int i=0;i<b.size();i++){
        if(b[i]>='0'&&b[i]<='9'){
            cnt+=b[i]-'0';
        }
    }
    return cnt;
}

我的函数这样写

0
0
0
Kevin
Kevin
初级守护
初级守护

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

string s[1010];
int f(string s){//找字符串里面的数字个数 
    int cnt=0;
    for(int i=0;i<s.size();i++)
        if(s[i] >= '0' && s[i] <= '9')
            cnt+= (s[i]-='0');
    return cnt;
}
string z(string s){//找字符串里面的数字个数 
    string sum="";
    for(int i=0;i<s.size();i++)
        if(s[i] >= '0' && s[i] <= '9')
            sum+=s[i];
    return sum;
}

bool cmp(string x,string y){
    if(f(x) != f(y))
    {
        return f(x) > f(y);
    }
    else if(z(x) != z(y))
    {
        return z(x) < z(y);
    }
    return x < y;
        
    
}
int main(){
    int n;
    cin>>n;
    getline(cin,s[0]);//吃换行
    for(int i=1;i<=n;i++)
        getline(cin,s[i]); 
    sort(s+1,s+1+n,cmp);
    for(int i=1;i<=n;i++)
        cout<<s[i]<<endl; 
    return 0;
}

我要回答