PAT乙级(11) 最难的问题 成绩排名 (water)
题目描述
NowCoder生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是军团中的一名军官,需要把发送来的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A 都分别替换成字母F),其他字符不 变,并且消息原文的所有字母都是大写的。密码中的字母与原文中的字母对应关系如下。
密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
输入描述:
输入包括多组数据,每组数据一行,为收到的密文。密文仅有空格和大写字母组成。
输出描述:
对应每一组数据,输出解密后的明文。
输入例子:
HELLO WORLD
SNHJ
输出例子:
CZGGJ RJMGY
NICE
思路:
可以使用数组,然后当超出数组范围时归零.控制好数字范围输出即可
代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
char a[26] =
{ 'A','B', 'C', 'D','E',
'F','G', 'H', 'I', 'J',
'K','L', 'M', 'N', 'O',
'P','Q', 'R', 'S', 'T',
'U','V', 'W', 'X', 'Y' ,'Z' };
string s,res;
int index=0;
while (getline(cin, s))
// 使用 getline(cin,s) 保证空格不被吞掉
{
res = "";
for (int i = 0; i < s.size(); i++)
{
if (s[i] == ' ')
{
res += ' ';
continue;
}
index = s[i] - 65 - 5;
if (index < 0)
{
int j = 26 + index;
res += a[j];
}
else
res += a[index];
}
cout << res << endl;
}
return 0;
}
// 使用 getline(cin,s) 保证空格不被吞掉
大写字符转字符数组对应位置 : s[ i ]-65
优化方案1:
链接:https://www.nowcoder.com/questionTerminal/9f6b8f6ec26d44cfb8fc8c664b0edb6b
来源:牛客网
#include <stdio.h>
#include <string.h>
int main()
{
char ch[26]={'V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'};
char str[100000];
while(gets(str)){
int len=strlen(str);
int i;
for(i=0;i<len;i++){
if(str[i]>='A'&&str[i]<='Z')
printf("%c",ch[str[i]-'A']);
else
printf("%c",str[i]);
}
printf("\n");
}
return 0;
}
优化方案2:
链接:https://www.nowcoder.com/questionTerminal/9f6b8f6ec26d44cfb8fc8c664b0edb6b
来源:牛客网
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF){
if ('A' <= c) {
c = 'E' < c ? (c - 5) : (c + 21);
}
putchar(c);
}
}
优化版本3:
链接:https://www.nowcoder.com/questionTerminal/9f6b8f6ec26d44cfb8fc8c664b0edb6b
来源:牛客网
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
char[] sw=new char[130];
String str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String str2="VWXYZABCDEFGHIJKLMNOPQRSTU";
for(int i=0;i<str1.length();i++){
sw[str1.charAt(i)]=str2.charAt(i);
}
String str=sc.nextLine();
String result="";
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' '){
result+=" ";
}else{
result+=sw[str.charAt(i)];
}
}
System.out.println(result);
}
}
}
题目描述
读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入描述:
每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 … … … 第n+1行:第n个学生的姓名 学号 成绩 其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出描述:
对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,字符串间有1空格。
输入例子:
3Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出例子:
Mike CS991301
Joe Math990112
思路:
不使用结构体:
定义变量,每次比较,然后得到最大最小值.需要注意第一次判断时,给最小成绩的三个变量赋值.
使用结构体
代码:
//作者:w
/*开始时间:
//结束时间:
//用时:分秒
//所属题库:PAT乙级练习题
//题目:
//思路:
//注意:
//总结:
*/
//非结构体
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n = 0;
string name;
string id;
int grade;
string maxname;
string maxid;
int maxgrade=0;
string minname;
string minid;
int mingrade = 0;
cin >> n;
int i = 0;
while (n--)
{
cin >> name >> id >> grade;
if (grade>=maxgrade)
{
maxgrade = grade;
if (i==0)
{
minname = name;
minid = id;
mingrade = grade;
i++;
}
maxid = id;
maxname = name;
}
else if (grade<mingrade)
{
minname = name;
minid = id;
mingrade = grade;
}
}
cout <<maxname<<" "<<maxid<< endl;
cout <<minname<<" "<< minid<< endl;
return 0;
}