计算机研究生复试-排序问题

KY74 字符串排序

题目描述

输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出排序后的结果

输入描述:
一个字符串,其长度n<=20

输出描述:
输入样例可能有多组,对于每组测试样例,
按照ASCII码的大小对输入的字符串从小到大进行排序,输出排序后的结果

示例1

输入

dcba

输出

abcd

本题总结:

1.按照ASCII码从小到大排序其实直接sort就可以完成。
2.看见字符串就要立马想到用string,并且知道string中用begin()和end()函数来表示第一个和最后一个字符。

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


int main(){
 string temp;
 while(cin>>temp){
      sort(temp.begin(),temp.end());
       cout<<temp;
 
 } 
return 0;
 
}

KY76 字符串排序

题目描述

编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。 如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。 如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。 如,输入: By?e 输出: Be?y

样例:

输入: A Famous Saying: Much Ado About Nothing(2012/8).

输出: A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).

本题总结:

1.遇见多种规则操作字符的题目时,要想到先利用函数进行判断,根据return返回值的不同即可区别字符串中的不同字符。

2.将大写字母转化为小写字母的方法:a=a-‘A’+‘a’

3.遇见同一个英文字母的大小写同时存在时,按照输入顺序排列这种情况时要想到可以把它们都转化为小写字母,接着再利用stable_sort排序就可以实现。

4.字符串的输入先定义一个char str[N];然后用while(gets(str))进行输入。

5.字符串的长度用int len=strlen(str);

6.如何保证大小字母进行从小到大排序,非大小字母保持原来位置?
把字符串str[N]里的字母全都复制到另一个字符串letter[N]里,然后对另一个只含字母字符串letter[N]进行排序。输出时对原字符串逐个字符输出,若该字符不是字母则直接输出,若是字母则从另一个字符串里面拿一个字符输出,这样就可以了

7.为了避免数组溢出,把N设置为1000.

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 1000
using namespace std; 
int IsLetter(char c)
{
if('a'<=c&c<='z') return 1;//小写字母返回1
else if('A'<=c&&c<='Z') return 2;//大写字母返回2
else return 0;//不是字母返回0
}

bool cmp(char a, char b){
 
       if(IsLetter(a)==2) a=a-'A'+'a';
       if(IsLetter(b)==2) b=b-'A'+'a';
       return a<b;
}


int main( )
{
char letter[N];
char str[N];
int len1;
int pos;
while(gets(str))
{
len1=0;
int len=strlen(str);
for(int i=0; i<len; i++){
if(IsLetter(str[i])!=0) letter[len1++]=str[i];
stable_sort(letter, letter+len1, cmp);}
//带有stable的函数可保证相等元素的原本相对次序在排序后保持不变。
pos=0;
for(int i=0; i<len; i++){
if(IsLetter(str[i])==0) printf("%c", str[i]);
else printf("%c", letter[pos++]);}
printf("\n");
}
return 0;
} 

KY68 子串计算

题目描述

给出一个01字符串(长度不超过100),求其每一个子串出现的次数。

输入描述:
输入包含多行,每行一个字符串。

输出描述:
对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。

输入

10101
输出

0 2
01 2
1 3
10 2
101 2

本题总结:

1.看见按照字典序排序就要想到用map,因为map内部自动按key排序
2. 字符串长度 当定义的是string str时,用str.length,当定义的是char str[100]时,用int len=strlen(str);

3.如何取到一个字符产中所有字串?

for(int i = 0; i <= str.length(); i++){
for(int j = 0; j < i; j++){
string sub_str = str.substr(j, i - j)
4.STL的输出

     for(map<string, int>::iterator it = mp.begin(); it != mp.end(); it++)
#include<iostream>
#include<map>
#include<string>
using namespace std;

map<string, int> mp;
//map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器),
//也就可以建立 string型到int型的映射。
int main(){
     string str;
      while(cin >> str){
        for(int i = 0; i <= str.length(); i++){
          for(int j = 0; j < i; j++){
            string sub_str = str.substr(j, i - j);
            //string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = “56789”
            //string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = “567”
            mp[sub_str]++;
            }
           } 
    for(map<string, int>::iterator it = mp.begin(); it != mp.end(); it++){
    //iterator是迭代器 
     if(it -> second > 1)
     cout << it -> first << ' ' << it -> second << endl;
      }}
      return 0;}

KY115 后缀字串排序

题目描述

对于一个字符串,将其后缀子串进行排序,例如grain
其子串有:
grain
rain
ain
in
n

然后对各子串按字典顺序排序,即:
ain,grain,in,n,rain

输入描述:

每个案例为一行字符串。

输出描述:

将子串排序输出

示例1

输入

grain

输出

ain
grain
in
n
rain

本题总结:

1.这道题思路和上面的那道题一模一样

2.str.size()和str.length()无区别

3.for(int i = 0 ;i < str.length(); i++)如果写成for(int i = 0 ;i < =str.length(); i++) 那么输出的结果就会多出一行空字符产,导致代码通不过。

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

map<string, int> mp;
int main(){
     string str;
      while(cin >> str){
      for(int i = 0 ;i < str.length(); i++){
         string sub_str = str.substr(i);
         mp[sub_str]++;
           }
           
    for(map<string, int>::iterator it = mp.begin(); it != mp.end(); it++){
       
     cout << it -> first << endl;
      }}
      return 0;}

KY234 最长&最短文本

本题总结:

1.疑惑点:while(getline(cin,str))怎么退出循环?

2.遇见包含空格字符串的输入用getline,因为要输入多行,所以while(getline(cin,str))

3.顺序输出用 stable_sort

4.vector数组中最后的一个元素用vi[vi.size()-1]表示

5.vector建立用vector vi; 添加元素用vi.push_back(str);
题目描述

输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输出。

输入描述:
输入包括多行字符串,字符串的长度len(1<=len<=1000)。

输出描述:
按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输出。

示例1

输入

hello
she
sorry
he

输出

he
hello
sorry

#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(string s1,string s2){
  return s1.length()<s2.length();
  }
int main(){
    vector<string> vi;
    string str;
    while(getline(cin,str)){
         // cin 是正在读取的输入流,而 str是接收输入字符串的 string 变量的名称。
        //getline函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
         vi.push_back(str);
         //a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
         stable_sort(vi.begin(),vi.end(),cmp);}
         //必须用stable_sort(),
  //因为普通sort()函数是使用快排实现的,快排是不稳定排序会导致长度相同的字符串输出顺序不符合要求 
    int min=vi[0].length();
    int max=vi[vi.size()-1].length();
    for(int i=0;i<vi.size();i++){
        if(vi[i].length()==min)cout<<vi[i]<<endl;
    }
    for(int i=0;i<vi.size();i++){
        if(vi[i].length()==max)cout<<vi[i]<<endl;
         }
     return 0;

    }

KY224 大整数排序

本题总结:

1.进行大数比较时先比较长度,长度短的数肯定小,如何长度相同再比较大小。

2.当题目要求输入一个N,之后输入N个字符串时用getchar可以吃掉前面输入字符以后敲的回车,这样才能读取后面的字符。

3.连续输入多行字符串的读入方法
for(int i=0;i<N;getline(cin,a[i++])); 注意这里有;!!!

题目描述

对N个长度最长可达到1000的数进行排序。

输入描述:

输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。

输出描述:
可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。

示例1

输入

3
11111111111111111111111111111
2222222222222222222222222222222222
33333333

输出

33333333
11111111111111111111111111111
2222222222222222222222222222222222

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

bool cmp(string a,string b)
{
    if(a.length()!=b.length())
            return a.length()<b.length();
    else
        return a<b;
}
int main()
{
    int N;
    while(cin>>N)
        {
        getchar();
        //getchar()函数以字符为单位对输入的数据进行读取。
        //getchar可以吃掉前面输入字符以后敲的回车,这样才能读取后面的字符。
        string a[N];
        for(int i=0;i<N;getline(cin,a[i++]));
        sort(a,a+N,cmp);
        for(int i=0;i<N;cout<<a[i++]<<endl);
    }
    }

KY219 最小年龄的3个职工

本题总结:

1.结构体名字要变为char数组形式,id和年龄不需要,直接用int就行。

2.比较年龄和id这种数字类型的,可以用if(a.age!=b.age)return a.age<b.age;这种形式

3.比较名字这种字符类型时,用return strcmp(a.name,b.name)<0;

4.strcmp函数,基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
所以当用来判断名字时,用 return strcmp(a.name,b.name)<0;

5.在输入数据时,&st[i].number,st[i].name,&st[i].age 注意id和年龄都要加&,名字不用。

6.声明结构体只需要在定义好的结构体后面取个名字加上一个数字就行。例如这里是struct staff{ }st[30];

题目描述

职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。

输入描述:

输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。

输出描述:
可能有多组测试数据,对于每组数据,

输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。
关键字顺序:年龄>工号>姓名,从小到大。

示例1

输入

5
501 Jack 6
102 Nathon 100
599 Lily 79
923 Lucy 15
814 Mickle 65

输出

501 Jack 6
923 Lucy 15
814 Mickle 65

#include<bits/stdc++.h>
using namespace std;
struct staff{
  int number;
    char name[11];
    int age;
}st[30];

bool cmp(staff a,staff b){
    if(a.age!=b.age)return a.age<b.age;
    else if(a.number!=b.number)return a.number<b.number;
        else return strcmp(a.name,b.name)<0;
}

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
    for(int i=0;i<n;i++)
     scanf("%d %s %d",&st[i].number,st[i].name,&st[i].age);
         sort(st,st+n,cmp);
         for(int i=0;i<n;i++){
         if(i==3)break;    
         printf("%d %s %d\n",st[i].number,st[i].name,st[i].age);       
  }}}

KY190 查找第K小数

题目描述

查找一个数组的第K小的数,注意同样大小算一样大。
如 2 1 3 4 5 2 第三小数为3。

输入描述:

输入有多组数据。

每组输入n,然后输入n个整数(1<=n<=1000),再输入k。

输出描述:

输出第k小的整数。

示例1

输入

6
2 1 3 5 2 2
3

输出

3

本题总结:

1.记住这里数组去重的思想先创建一个数组a(尽可能大一点),使之全为0.然后根据输入的不同数把数组a对应下标的数变为1.之后再把a数组遍历,把对应位置是1的放入。这样就实现了去重。(因为不管你输入几次,在a数组数字对应的那个位置的值变为了1,所以之后用if(a[i]==1) 取的时候只取一个)

2.vector创建的方法 vector后面加类型加名字
3. vector和上面这种去重方法一起使用,用nums.push_back(i)就可以实现从小到大排序。

#include <iostream>
#include <vector>
using namespace std;

int main(){   
   int n,k;    
   while(cin>>n){ 
      int a[1000]={0},num;        
      for(int i=0;i<n;i++){            
         cin>>num;            
         a[num]=1;        }
         cin>>k;        
         vector<int> nums;        
         for(int i=0;i<1000;i++){
             if(a[i]==1) nums.push_back(i);       
          }
         cout<<nums.at(k-1)<<endl;   
      }   
          return 0;
         }

KY82 字符串排序

题目描述

先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串少于一百个字符。 如果在输入过程中输入的一个字符串为“stop”,也结束输入。 然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。

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

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

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

输入

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

本题总结:

1.用getchar()吃回车键

2.vector循环输入的时候用 getline(cin,str); v.push_back(str);
而不是cin>>v[i].str.

3.vector的sort是用sort(v.begin(),v.end(),cmp);

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

bool cmp(string a,string b){    
    return a.size()<b.size();
 }

int main(){    
     int n;    
     string str;
     while(cin>>n){       
        getchar();        
        vector<string>v;
        for(int i=0;i<n;i++){            
             getline(cin,str);
             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;
                }    }} 

KY29 谁是你的潜在朋友

题目描述

“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。

首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。

输入描述:
每个案例第一行两个整数N,M,2 <= N ,M<= 200。接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)

输出描述:
每个案例包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)
示例1

输入

4 5
2
3
2
1

输出

1
BeiJu
1
BeiJu

本题总结:

1.对map的应用

#include<iostream>
#include<cstdio>
#include<map>

using namespace std;

int main(){    
    int n,m;    
    while(scanf("%d%d",&n,&m)!=EOF){
      map<int,int> book_num;//map<书编号,人数>  
      map<int,int> stu_book;//map<读者号,书编号>
      for(int i=0;i<n;i++){//第i个读者            
          int bookNumber;            
          scanf("%d",&bookNumber);
         
          stu_book[i]=bookNumber;//第i个读者喜欢看的书编号为bookNumber;
          book_num[bookNumber]++;//同时把喜欢看书编号为bookNumber的人数+1       
      }
        map<int,int>::iterator it;
        for(it=stu_book.begin();it!=stu_book.end();it++){//读者号从0~n-1
         int num=book_num[it->second]-1;//把自己减掉  
              if(num==0){ printf("BeiJu\n");           
               }
              else{
               cout<<num<<endl;
                }        }    }   
         return 0;}

KY154 排名

题目描述

今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。

输入描述:
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。

输出描述:
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。

示例1

输入

4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1 2
CS001 3 2 3 5
1 2 40
10 30
CS001 1 2
2 3 20
10 10 10
CS000000000000000001 0
CS000000000000000002 2 1 2
0

输出

3
CS003 60
CS001 37
CS004 37
0
1
CS000000000000000002 20

本题总结:

待定。


#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 1000
#define M 11
#define LEN 21
using namespace std;
struct info{
char id[LEN];//准考证号
int score;//该学生 总分
}stu[N];
bool cmp(info a, info b)//排序规则
{
if(a. score!=b. score) return a. score>b. score;
else return strcmp(a.id, b.id)<0;
}
int main( ){
int n, m,line;//人数、科目数、分数线
int bonus [M];//每道题的分值
int winner;//过线人数
while( EOF !=scanf("%d", &n))
{
if(n==0) break ;
scanf( "%d%d", &m, &line);
for(int i=1; i<=m; i++){
scanf("%d" ,&bonus[i]);
}

for(int i=0; i<n; i++){
scanf("%s%d", stu[i].id, &m);
stu[i]. score=0;
int x;
while(m--){
scanf("%d", &x);
stu[i]. score+=bonus[x];
}
}
sort(stu, stu+n, cmp);//按既定规则排名次
winner=0;//过线人数,准备统计一下
for(int i=0; i<n; i++)
{
if(stu[i]. score>=line) winner++;
else break;}
printf("%d\n", winner);
for(int i=0; i<winner; i++)
{
printf("%s %d\n", stu[i].id, stu[i].score);
}}
return 0;
}

KY 140 开门人和关门人

题目描述

每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。

输入描述:

每天的记录在第一行给出记录的条目数M (M > 0 ),下面是M行,每行的格式为 

证件号码 签到时间 签离时间 

其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

输出描述:

对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。 
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。

示例1

输入

3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40

输出

SC3021234 CS301133

本题总结:

待定

#include<iostream>
#include<cstring>
using namespace std; 
struct people{
char number[16];//证件号
char time_start[10];//签到时间 
char time_end[10];//离开时间
};
int main()
{
int n;
people peo[100];
char open_time[10], close_time[10];
cin >> n;
for (int i = 0; i < n; i++)//输入信息
cin >> peo[i].number >> peo[i].time_start >> peo[i].time_end;
strcpy(open_time, peo[0].time_start);
strcpy(close_time, peo[0].time_end);
for (int i = 1; i < n; i++)//寻找时间
{
if(strcmp(open_time ,peo[i].time_start)>0)
   strcpy(open_time, peo[i] . time_start);
if(strcmp(close_time, peo[i]. time_end)<0)
   strcpy(close_time, peo[i].time_end);
}
for (int i = 0; i < n; i++)//输出开门
{
    if (strcmp(open_time, peo[i].time_start)== 0)
     cout << peo[i].number << " ";
}
for (int i = 0; i < n; i++)//输出关门
{
if (strcmp(close_time, peo[i].time_end) == 0) 
     cout << peo[i].number <<endl;
}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值