Pat刷题真题乙级(4)

前言

这个周末花了两天才写了五道题,嘿嘿!康康吧!

Pat乙级1013(组个最小数)

题目链接
题目描述:

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:
给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入描述:

每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空
格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出描述:

在一行中输出能够组成的最小的数。

输入例子:

2 2 0 0 0 3 0 0 1 0

输出例子:

10015558

分析
输入一串10个数字,依次从0到9,在0位输入2,就是有2个0,在1位置输入2,就是有两个1,以此类推。存入到一个字符串00115558,然后按最小排序输出。

ac代码为:

import java.util.Scanner;
public class Niuk1013 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int[] a = new int[10];
        String str = "",str2 = "";
        int b=0,c=0;
        for(int i=0;i<10;i++){
    
    
            a[i] = scan.nextInt();
        }
        for (int j=0;j<10;j++){
    
    
            if(a[j]==0){
    
     }//如果输入的数为0,则继续
            else {
    
    
                for(int k=0;k<a[j];k++){
    
    
                    str =str+j;      //把数存进字符串里2 2 0 0 0 3 0 0 1 0
                    b++;          //统计有多少位数     00115558
                }
            }
        }
        //00225558 20025558
        for(int i=0;i<b;i++) {
    
    
            char ch = str.charAt(i);
            if(ch!='0'){
    
    
                str2 = str.charAt(i) + str.substring(0,i)+str.substring(i+1);
                break;
            }
        }
        System.out.println(str2);
    }
}

Pat乙级1014(科学计数法)

题目链接
题目描述:

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[±][1-9]"."[0-9]+E[±][0-9]+,即数字的整数部分
只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。

输入描述:

每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。

输出描述:

对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。

输入例子:

+1.23400E-03

输出例子:

0.00123400

分析
首先先把E前后的字符存到字符串中,然后处理好正负号,理解前后正负号的差异,再进行做题。在字符串中插入字符,我用了StringBuilder。

ac代码为:

import java.util.Scanner;
public class Niuk1014 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        String[] str2 = str.split("E");
        String str3 = "", str4 = "";
        char t = 0;
        //遍历E前面的
        for (int i = 0; i < str2[0].length(); i++) {
    
    
            char ch = str2[0].charAt(i);
            if (ch != '.' && ch != '+' && ch != '-') {
    
    
                str3 = str3 + ch;  //
            }
        }
        //遍历E后面的
        //+1.23400E-03   0.00123400
        //+1.23400E+03   123.400
        for (int i = 0; i < str2[1].length(); i++) {
    
    
            char ch2 = str2[1].charAt(i);
            if (ch2 != '+' && ch2 != '-') {
    
    
                str4 = str4 + ch2;
            } else t = ch2;
        }
        //-1.23400E-03  str3=-123400  -0.00123400
        int f = Integer.parseInt(str4);//E后面的数值
        char ch3 = str.charAt(0);//获取正负号
        boolean jud = true;
        if(ch3=='-')jud=false;//int a=0
            if (t == '+') {
    
    
                if (f < str3.length()) {
    
    
                    StringBuilder sb = new StringBuilder(str3);
                    sb.insert(f, ".");
                    str3= sb.toString();
                }
                else {
    
    
                    int x = f - str3.length()+1;
                    for (int i = 0; i < x; i++) {
    
    
                        str3 = str3 + "0";
                    }
                }

            }
            else if (t == '-') {
    
    
                for (int i = 0; i < f; i++) {
    
    
                    str3 = "0" + str3;
                }
                StringBuilder sb = new StringBuilder(str3);
                sb.insert(1, '.');
                str3=sb.toString();
        }
//jud==false;
        if(!jud)
        {
    
    str3="-"+str3;}
        System.out.println(str3);
    }
}

Pat乙级1017(打印沙漏)

题目链接
题目描述:

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

 *****
  ***
   *
  ***
 *****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递
增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入描述:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出描述:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入例子:

19 *

输出例子:

*****
 ***
 *
 ***
*****
2

分析
作一个循环,符号相加如果大于输入的数值,则break,否则算出有多少层,和完整漏斗符号多少。三个for循环来输出上部分的符号和空格。

ac代码为:

import java.util.Scanner;
public class Niuk1017 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String str = scan.next();
        int sum=-1,gip=0,b=0;
        for(int i=1;;i++){
    
    
            sum = sum+(i*2-1)*2;//从1加到两侧
            if(sum>n){
    
    
                break;
            }
            gip++;
            b=sum;
        }
        //上半部分有gip层
        //*****
        // ***
        //  *
        for(int i=gip;i>0;i--){
    
    
            //输出空隔
            for(int j=gip-i;j>0;j--){
    
    
                System.out.print(" ");
                //输出字符
            }
            for(int k=1;k<=2*i-1;k++){
    
    
                System.out.print(str);
            }
            System.out.println();
        }
        //下部分
        for(int i=2;i<=gip;i++){
    
    
            //输出空隔
            for(int j=gip-i;j>0;j--){
    
    
                System.out.print(" ");
                //输出字符
            }
            for(int k=1;k<=2*i-1;k++){
    
    
                System.out.print(str);
            }
            System.out.println();
        }
        System.out.print(n-b);
    }
}

Pat乙级1018(人口普查)

题目链接
题目描述:

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200
岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入描述:

输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及
按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。

输出描述:

在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。

输入例子:

5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20

输出例子:

3 Tom John

分析
先存入合理人的信息,再从合理的人中判断最年长人和最年轻人。
ac代码为:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Niuk1018 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        scan.nextLine();
        int flag=0;
        int max=1814, min =2014;
        String Maxname="",Minname="";
        for(int i=0;i<n;i++){
    
    
            String str = scan.nextLine();
            String[] str2 = str.split(" ");
            Map<String,String> map1=new HashMap<>();
            int a = Integer.parseInt(str2[1].substring(0,4));
            int b = Integer.parseInt(str2[1].substring(5,7));
            int c = Integer.parseInt(str2[1].substring(8));
            //判断有多少个人合理
            if(a>1814&&a<2014) {
    
    
                flag++;
                map1.put(str2[0],str2[1]);
            }else if(a==1814){
    
    
               if(b==9&&c>=6){
    
    flag++;map1.put(str2[0],str2[1]);}
               else if(b>9){
    
    flag++;map1.put(str2[0],str2[1]);}
            }else if(a==2014){
    
    
                if(b==9&&c<=6){
    
    flag++;map1.put(str2[0],str2[1]);}
                else if(b<9){
    
    flag++;map1.put(str2[0],str2[1]);}
            }
                for(String tmp:map1.keySet()){
    
    
                    int a2 = Integer.parseInt(map1.get(tmp).substring(0,4));
                    if(a2>=max){
    
    
                        max = a2;
                        Maxname = tmp;
                    }
                    if(a2<=min){
    
    
                        min = a2;
                        Minname = tmp;
                    }
                }
            }
        System.out.print(flag+" "+Minname+" "+Maxname);
        }
    }


Pat乙级1019(旧键盘)

题目链接
题目描述:

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出
肯定坏掉的那些键。

输入描述:

输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、
以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。

输出描述:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。

输入例子:

7_This_is_a_test
_hs_s_a_es

输出例子:

7TI

分析
把实际输入的文字存到set()里面,去除重复的字符,把应该输入的文字和set里面的字符比较,再和list比较,list是用来存入坏掉键的字符。如果set里无,list里无,则存入list。(list可排序)
ac代码为:

import java.util.*;
public class Niuk1019 {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine().toUpperCase();
        String str2 = scan.nextLine().toUpperCase();
        //7_This_is_a_test  a串 从a串中找到B串没有的字符。   并且按顺序找一次   list<>7 t i
        //_hs_s_a_essssssssssse        b串 set<> t2{_,h,s,a,e}
        List<String> list = new ArrayList<>();
        Set<String> set2=new HashSet<>();
        //7_This_is_a_test
        //第二个字符串
        for(int i=0;i<str2.length();i++){
    
    
            set2.add(str2.charAt(i)+"");
        }
        for(int i=0;i<str.length();i++){
    
    
            char ch = str.charAt(i);
            if(!set2.contains(ch+"")){
    
    
                if(!list.contains(ch+"")){
    
    
                list.add(ch+"");
            }
          }
        }
        for(String tmp:list) {
    
    
            System.out.print(tmp);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41638508/article/details/105478639