首页 > 试题广场 >

字符串排序

[编程题]字符串排序
  • 热度指数:9492 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串少于一百个字符。 如果在输入过程中输入的一个字符串为“stop”,也结束输入。 然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。

输入描述:
字符串的个数,以及该组字符串。每个字符串以‘\n’结束。如果输入字符串为“stop”,也结束输入.


输出描述:
可能有多组测试数据,对于每组数据,
将输入的所有字符串按长度由小到大排序输出(如果有“stop”,不输出“stop”)。

根据输入的字符串个数来动态分配存储空间(采用new()函数)。每个字符串会少于100个字符。
测试数据有多组,注意使用while()循环输入。
示例1

输入

5
sky is grey
cold
very cold
stop
3
it is good enough to be proud of
good
it is quite good

输出

cold
very cold
sky is grey
good
it is quite good
it is good enough to be proud of

python解法:

while True:
    try:
        a, res = int(input()), []
        for i in range(a):
            string=input()
            if string!="stop":
                res.append(string)
            else:
                break
        for i in sorted(res,key=len):
            print(i)
    except:
        break
发表于 2017-10-06 15:47:36 回复(1)
Java
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine();
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String line = scanner.nextLine();
            if (line.equals("stop")) break;
            else list.add(line);
        }
        list.sort(Comparator.comparingInt(String::length));
        for (String s : list) System.out.println(s);
    }
}


发表于 2020-03-20 10:11:54 回复(0)
#include <stdio.h>
#include <string.h>

typedef struct node
{
    char a[100];
}Node;
int cmp(Node *i,Node *j)
{
    return strlen((*i).a)-strlen((*j).a);
}
int main()
{
    int n,k;
    while(scanf("%d",&n)!=EOF)
    {
        getchar();                    //scanf()用%c,%s空格键,Tab键,回车键结束一次输入,不会舍弃最后的回车符或空格或Tab(即还在缓冲区中),可使用getchar来吸收scanf()执行之后的换行符。
        Node c[n];
        for(k=0;k<n;k++)
        {
            gets(c[k].a);
            if(strcmp(c[k].a,"stop")==0)break;
        }
        qsort(c,k,sizeof(Node),cmp);
        for(int i=0;i<k;i++)puts(c[i].a);
    }
}

发表于 2020-02-11 11:45:09 回复(0)
# include<stdio.h>
# include<string.h>
# include<algorithm>
using namespace std;

struct E
{
    char s[105];
    int length;
};

bool cmp(E a,E b)
{
    return a.length<b.length;
}

int main()
{
    int n,i;
    char stop[]="stop";
    while(scanf("%d",&n)!=EOF)
    {
        getchar();
        E *buf = new E[n];
        for(i=0;i<n;i++)
        {
            gets(buf[i].s);
            int tmp = strcmp(stop,buf[i].s);
            if(tmp==0)  n=i;
            buf[i].length=strlen(buf[i].s);
        }
        sort(buf,buf+n,cmp);
        for(i=0;i<n;i++)
        {
            puts(buf[i].s);
        }
    }
    return 0;
}

发表于 2018-02-16 12:20:47 回复(0)
自定义排序函数
#include <stdio.h>
#include <string.h>

typedef struct str{
    char s[100];
    int len;
}str;

int cmp(const void *a,const void *b){
        return (*(str *)a).len- (*(str *)b).len;
}

int main(){
    int n,i,j;
    while(scanf("%d ",&n)!=EOF){
        str a[n];
        for (i=0,j=0;i<n;i++) {
            gets(a[i].s);
            if(!strcmp(a[i].s,"stop")) break;            
            j++;
            a[i].len=strlen(a[i].s);
        }
        qsort(a,j,sizeof(a[0]),cmp);
        for(i=0;i<j;i++){
            printf("%s\n",a[i].s);
        }
    }
}
(•̀ᴗ•́)و

发表于 2021-03-10 22:23:48 回复(1)
#include<stdio.h>
(737)#include<string.h>
int main()
{
    int n=100,i,j;char a[100][100],b[100];
    while(scanf("%d",&n)!=EOF)
    {
        getchar();//吸收gets前面的回车
        for(i=0;i<n;i++)//1.输入
        {
            gets(a[i]);
            if(strcmp(a[i],"stop")==0)
            {
                n=i;break;//去掉stop
            }
        }
        for(i=0;i<n-1;i++)//2.冒泡排序
            for(j=0;j<n-1-i;j++)
                if(strlen(a[j])>strlen(a[j+1]))
                {//交换
                    strcpy(b,a[j]);strcpy(a[j],a[j+1]);strcpy(a[j+1],b);
                }
        for(i=0;i<n;i++) //3.输出
            printf("%s\n",a[i]);
    }
}

发表于 2020-04-06 21:26:48 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	map<int,string>m;
	cin>>n;
	cin.ignore(1024,'\n');
	string *str=new string[n];
	for(int i=0;i<n;i++){
		
		getline(cin,str[i]);
	//	cin.ignore(1024,'\n');
		if(str[i]=="stop"){
			break;
		}
		//cout<<str[i].size()<<endl;
		m[str[i].size()]=str[i];
	}
	for(auto it=m.begin();it!=m.end();it++){
		cout<<it->second<<endl;
	}
	delete[] str;
	return 0;
}

发表于 2020-03-17 15:35:43 回复(2)
这道题最大的坑在于cin,getline(cin,str),cin.getline()对换行符使用的问题:
1.cin输入后是不去除后面的\n的
2.getline会将\n换成\0,并主动丢弃换行符
3.cin.getline()读取到\n会换成\0,但是会把换行符保留在输入队列中
代码实现方面只能说STL里的vector和sort真是太香了
#include<bits/stdc++.h>
using namespace std;
bool cmp(string s1,string s2){
    return s1.length()<s2.length();
}
int main(){
    int n;
    while(cin>>n){
        vector<string> vs;
        getchar();
        for(int i=0;i<n;i++){
            string str;
            getline(cin,str);
            if(str=="stop"){
                break;
            }
            vs.push_back(str);
        }
        sort(vs.begin(),vs.end(),cmp);
        for(vector<string>::iterator it=vs.begin();it!=vs.end();it++){
            cout<<*it<<endl;
        }
    }
    return 0;
}



发表于 2020-02-19 18:54:32 回复(0)
string + 冒泡排序
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
    int n;
    while(scanf("%d", &n)!=EOF)
    {
        getchar();
        string ans[1001];
        int k;
        for(int i=0; i<n; i++)
        {
            getline(cin, ans[k]);
            if(ans[k]=="stop")
                break;
            k++;
        }
        for(int i=0; i<k; i++)
            for(int j=0; j<k-i-1; j++)
            {
                if(ans[j].size() > ans[j+1].size())
                {
                    string temp;
                    temp = ans[j];
                    ans[j] = ans[j+1];
                    ans[j+1] = temp;
                }
            }
        for(int i=0; i<k; i++)
        {
            cout<<ans[i]<<endl;
        }
    }
}
发表于 2019-03-23 15:05:11 回复(1)

人生苦短~

while True:
    try:
        num = int(input())
        tempInput = []
        for i in range(num):
            temp = input()
            if temp == 'stop':
                break
            tempInput.append(temp)
        tempInput.sort(key=lambda x:len(x))
        for i in tempInput:
            print(i)
    except Exception:
        break
编辑于 2018-09-29 20:51:50 回复(0)
不难,不过要细心
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define LEN 101
#define N 1000
using namespace std;

typedef struct{
    char str[LEN];
}STR;

bool cmp(STR a, STR b)
{
    return strlen(a.str)<strlen(b.str);
}

int main()
{
    int num;//记录究竟输入了几个字符串
    int n;//本打算输入几个字符串
    STR a[N];
    while(scanf("%d", &n)!=EOF)
    {
        num=0;
        getchar();//吸收回车
        for(int i=0; i<n; i++)
        {
            gets(a[num++].str);
            if(strcmp(a[num-1].str, "stop")==0)
            {
                num--;
                break;
            }
        }
        sort(a, a+num, cmp);
        for(int i=0; i<num; i++)
        {
            puts(a[i].str);
        }
    }
    return 0;
}

编辑于 2018-02-22 17:28:49 回复(0)
try:
    while 1:
        n = input()
        result = []
        for i in xrange(n):
            s = raw_input()
            if s == 'stop':
                break
            result.append((s, len(s)))
        result = sorted(result, key=lambda x:x[1])
        for j, k in result:
            print j
except:
    pass

发表于 2016-12-28 18:12:32 回复(0)
//是基于第二位大神写的改了冒泡算法哪里
public class MaoPao {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			String str = scanner.nextLine();
			int strNum = Integer.valueOf(str);
			int count = 0;
			String[] strList = new String[strNum];
			for (int i = 0; i < strNum; i++) {
				strList[i] = scanner.nextLine();
				count++;
				if (strList[i].equals("stop")) {
					strList[i] = "";
					count--;
					break;
				}
			}
         //冒泡算法的另一种
                            //输入英文的个数,也是循环的个数
			for (int i = 1; i < strList.length; i++) {
                            //每次跟下一个比较,小的数提前,大的不变。
				for (int j = 0; j < strList.length - i; j++) {
					if (strList[j].length() > strList[j+1].length()) {
						String temp = strList[j];
						strList[j] = strList[j+1];
						strList[j+1] = temp;
					}
				}
			}
			for (int i = 0; i < count; i++) {
				System.out.println(strList[i]);
			}
		}
	}

}

编辑于 2016-09-26 15:52:33 回复(0)
#include<bits/stdc++.h>
int main(){
    int n,s;
    char b[100]={},a[100][100]={};
    while(scanf("%d",&n)!=EOF){//输入n后会有一个残留的换行符
        memset(b,0,sizeof(b));
        memset(a,0,sizeof(a));
        for(int i=0;i<=n;i++){//多循环一次以便吸收输入n后的换行符,也可用getchar
            gets(b);
            if(strcmp(b,"stop")==0)
                break;
            strcpy(a[strlen(b)],b);
        }
        for(int i=0;i<100;i++)
            if(a[i][0]!=0)
                puts(a[i]);
    }
}//还是Hash
编辑于 2019-03-07 11:32:08 回复(0)
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

bool cmp(string str1, string str2)
{
    return str1.length() < str2.length();
}

int main()
{
    string str;
    vector<string> v;
    int n;
    while(cin >> n)
    {
        getchar();      // 吸收 cin 之后的回车
        v.clear();
        while(n--)
        {
            getline(cin, str);
            // str == stop
            if(str == "stop")
            {
                break;
            }
            v.push_back(str);
        }
        sort(v.begin(), v.end(), cmp);
        for(int i = 0; i < v.size(); ++i)
        {
            cout << v[i] << endl;
        }
    }
    return 0;
}


发表于 2016-08-12 15:50:00 回复(3)
def leng(s):
    a = []
    for i in s:
        l = len(i)
        a.append(l)
   # print(a)
    return a
def str_sort(s):
    flag = True
    a = leng(s)
    while flag:
        flag = False
        for i in range(1, len(a)):
            if a[i-1] > a[i]:
                a[i-1], a[i] = a[i], a[i-1]
                s[i-1], s[i] = s[i], s[i-1]
                
                flag = True
    return s

while True:
    try:
        arr = []
        n = int(input())
        for i in range(n):
            a = input()
            if a == 'stop':
                break
            arr.append(a)
        res = str_sort(arr)
        res = '\n'.join(res)
        print(res)
    except:
        break

编辑于 2024-03-21 23:09:33 回复(0)
import java.util.Scanner;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
/*
*	注意:
*		只要nextInt,next,nextdouble方法在nextLine前面时,
*		就会跳过nextline的输入nextInt()是以换行符或者回
*		车结束的,表示输入结束。而换行符 ” /n“,回车符 也是
*		一个字符.nextLine()会把前者的换行符或者回车一个字符
*		输入,所以nextLine不是没有录入值,而是直接把换行符或
*		者回车符录入,直接结束输入,所以nextLine不需要再从控制台中录入。
*/
public class Main {
    public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			
			int n = scanner.nextInt();
			scanner.nextLine();	// 消耗掉换行符
			
			//设置一个map用来存储字符串和字符串的长度
			Map<String, Integer> myMap = new TreeMap<String, Integer>();
			
			for (int i = 0; i < n; i++) {
				
				String str = scanner.nextLine();
				if (str.equals("stop")) {
					break;
				}
				int length = str.length();
				myMap.put(str, length);
			}
			
			
			List<Map.Entry<String, Integer>> myList = new ArrayList<>(myMap.entrySet());
			
			myList.sort(Map.Entry.comparingByValue());
			
			Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
			for(Map.Entry<String , Integer> entry : myList) {
				sortedMap.put(entry.getKey(), entry.getValue());
			}
			
			for(Map.Entry<String, Integer> entry: sortedMap.entrySet()) {
				System.out.println(entry.getKey());
			}
			
		}
	}
}

编辑于 2024-03-18 20:28:15 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
bool compare(string a,string b){
    return a.size()<b.size();
}
int main(){
     int N;
      char gap;
    while( scanf("%d%c",&N,&gap)!=EOF){
     
      vector<string> vec;
      scanf("%d%c",&N,&gap);
      for(int i=0;i<N;i++){
         string str;
         getline(cin,str);
         if(str=="stop") break;
         vec.push_back(str);
      }
      sort(vec.begin(),vec.end(),compare);
      for(int j=0;j<vec.size();j++){
          cout<<vec[j]<<endl;
      }
    }
    
    
}

编辑于 2024-03-17 19:37:55 回复(0)
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//字符串比较函数(用于排序)
bool compare(const string& str1, const string& str2) {
    return str1.length() < str2.length();
}

int main() {
    int n;
    while (cin >> n) {
        getchar();  //吃掉空格
        vector<string>arr;
        while (n--) {
            string str;
            getline(cin, str);
            if (str == "stop") {
                break;
            }
            arr.push_back(str);
        }
        sort(arr.begin(), arr.end(), compare);
        for (const auto& str : arr) {
            cout << str << endl;
        }
    }
    return 0;
}

编辑于 2024-03-01 12:04:10 回复(0)
C++中,我不明白为什么要加个getchar()
编辑于 2024-02-18 14:44:08 回复(0)