初级守护
小明最近学习了很多的排序算法。老师想检验一下他的水平,给他出了一道题目:现在有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.你 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函数的里面排序顺序有问题
初级守护
- 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;
- }
中级光能
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; }
我的函数这样写
中级守护
#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;
}