PAT乙级41到60题练习代码全纪录

  • 1041 考试座位号
  • 1042 字符统计
  • 1043 输出PATest
  • 1044 火星数字
  • 1045 快速排序(1、3、4、5测试点运行超时)
  • 1046 划拳
  • 1047 编程团体赛
  • 1048 数字加密
  • 1049 数字的片段和(测试点2、3运行超时)
  • 1050 螺旋矩阵(测试点6、7运行超时)
  • 1051 复数乘法
  • 1052 卖个萌(测试点0、1答案错误)
  • 1053 住房空置率
  • 1054 求平均值
  • 1055 集体照
  • 1056 组合数的和
  • 1057 数零壹
  • 1058 选择题
  • 1059 C语言竞赛(测试点1、2运行超时)
  • 1060 爱丁顿数

1041 考试座位号

import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine().trim());String[] info = new String[n + 1];    // n个考生的信息,为了便于查找初始化n+1个for(int i = 0; i < n; i++) {String[] temp = br.readLine().trim().split("\\s+");int testPos = Integer.parseInt(temp[1]);    // 试机座位号info[testPos] = temp[0] + " " + temp[2];   // 试机座位号对应的其他信息}int m = Integer.parseInt(br.readLine().trim());int[] test = new int[m];                       // m个待查询试机座位号String[] temp = br.readLine().trim().split("\\s+");for(int j = 0; j < m; j++) {test[j] = Integer.parseInt(temp[j]);}for(int j = 0; j < m; j++) {System.out.println(info[test[j]]);}}
}

1042 字符统计

import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str = br.readLine().trim().toLowerCase();Character ch; // 当前字符int max = 0;  // 最大字频int[] count = new int[26]; // 字母字频统计for (int i = 0; i < str.length(); i++) {ch = str.charAt(i);if (Character.isLetter(ch)) {int index = ch - 'a';count[index]++;if (count[index] > max)max = count[index];}}/* 按照字母顺序输出第一个字频最大的 */for (int i = 0; i < 26; i++) {if (count[i] == max) {System.out.println((char) (i + 'a') + " " + max);break;}}}
}

1043 输出PATest

方法一:

import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main { public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str = br.readLine().trim();int[] count = new int[6]; // 对PATest的每个字母进行计数String sample = "PATest";for (int i = 0; i < str.length(); i++) {for (int j = 0; j < 6; j++) {if (str.charAt(i) == sample.charAt(j)) {count[j]++;}}}int total = count[0] + count[1] + count[2] + count[3] + count[4] + count[5];while (total > 0) { // 直到全部输出for (int i = 0; i < 6; i++) {if (count[i] > 0) {count[i]--;total--;System.out.print(sample.charAt(i));}}}}
}

方法二:

import java.io.InputStreamReader;
import java.util.HashMap;
import java.io.BufferedReader;
public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str = br.readLine().trim();String sample = "PATest";HashMap<Character, Integer> count = new HashMap<>();for (int i = 0; i < 6; i++) {count.put(sample.charAt(i), 0); // 初始化}for (int i = 0; i < str.length(); i++) {count.computeIfPresent(str.charAt(i), (k, v) -> v + 1); // 计数}Character key;int total = count.get('P') + count.get('A') + count.get('T') + count.get('e') + count.get('s') + count.get('t');while (total > 0) {for (int i = 0; i < 6; i++) {key = sample.charAt(i);if (count.get(key) > 0) {System.out.print(key);total--;}count.computeIfPresent(key, (k, v) -> v - 1); // 输出}}}
}

1044 火星数字

唯一的坑就是!13、26这样的十进制,写成十三进制是10、20,但是火星文是tam、hel,也就是说,个位的0不需要表示出来。

import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main {static String[] sample1 = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" }; // 低位数字static String[] sample2 = { "tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" }; // 高位数字public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine().trim());String[] words = new String[n];String[] trans = new String[n];for (int i = 0; i < n; i++) {words[i] = br.readLine().trim();if (Character.isLetter(words[i].charAt(0))) { // true则是火星文trans[i] = toEarth(words[i]);} else {trans[i] = toMartian(words[i]);}}for (int i = 0; i < n; i++)             // 输出结果System.out.println(trans[i]);}public static String toMartian(String s) { // 数字转火星文StringBuilder mars = new StringBuilder("");int earth = Integer.parseInt(s);if (earth == 0) {mars.append("tret");} else {int temp1 = earth % 13; // 低位int temp2 = (earth / 13) % 13; // 高位if (temp2 > 0)mars.append(sample2[temp2]);if(temp1 != 0 && temp2 != 0)mars.append(" ");if (temp1 > 0) // 低位为零时不输出mars.append(sample1[temp1]);}return mars.toString();}public static String toEarth(String s) { // 火星文转数字int earth = 0;String[] temp = s.split("\\s+");if (temp[0] != "tret") {for (int i = 0; i < temp.length; i++) {for (int j = 1; j < 13; j++) {if (temp[i].equals(sample1[j]))earth += j;if (temp[i].equals(sample2[j]))earth += j * 13;}}}return String.valueOf(earth);}
}

1045 快速排序(1、3、4、5测试点运行超时)

本题java劝退,典型的考效率的,时间复杂度不能超过O(n),解决问题本身很简单。另外,坑点注意!测试点2是主元为0的情况,要输出 “0\n\n” 格式才正确。
思路一(较慢,只能过测试点0):

import java.io.InputStreamReader;
import java.io.BufferedReader;public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.valueOf(br.readLine().trim());String[] temp = br.readLine().trim().split("\\s+");int[] arr = new int[n];int minIndex = 0; // minIndeX左侧的均不可能为主元int maxIndex = 0; // maxIndeX右侧的均不可能为主元for (int i = 0; i < n; i++) {arr[i] = Integer.valueOf(temp[i]);if (arr[i] <= arr[minIndex])minIndex = i;if (arr[i] >= arr[maxIndex])maxIndex = i;}int[] key = new int[maxIndex - minIndex + 1];int index = 0;for (int i = minIndex; i <= maxIndex; i++) {boolean flag = true;for (int j = maxIndex - 1; j > i; j--) {if (arr[j] < arr[i]) {        // 如果在一个元素右侧找到了比它小的i = j;                  // 二者及二者之间均不可能为主元flag = false;break;}}if (flag)key[index++] = arr[i];}System.out.println(index);if (index > 0) {for (int i = 0; i < index - 1; i++)System.out.print(key[i] + " ");System.out.println(key[index - 1]);}}}

思路二(当前最优,能过测试点0和2):

import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.BufferedReader;
public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.valueOf(br.readLine().trim());String[] temp = br.readLine().trim().split(" ");int[] arr = new int[n];int[] sortedArr = new int[n]; // 排好序的数组for (int i = 0; i < n; i++) {arr[i] = Integer.valueOf(temp[i]);sortedArr[i] = arr[i];}Arrays.sort(sortedArr);int leftMax = 0;          // 左侧最大的元素int[] key = new int[n];int index = 0;for (int i = 0; i < n; i++) {if (arr[i] == sortedArr[i] && sortedArr[i] > leftMax)key[index++] = arr[i]; // 与排好序的元素在同一位置,且比左侧最大原色还大就是主元if (arr[i] > leftMax)   // 更新左侧最大值leftMax = arr[i];}System.out.println(index);if (index > 0) {for (int i = 0; i < index - 1; i++)System.out.print(key[i] + " ");System.out.println(key[index - 1]);} else {System.out.println();}}}

1046 划拳

如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,请你统计他们最后分别输了几次。

甲输:乙划 ==(甲喊 + 乙喊)且 甲划 !=(甲喊 + 乙喊)
乙输:甲划 ==(甲喊 + 乙喊)且 乙划 !=(甲喊 + 乙喊)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.valueOf(br.readLine().trim()); // n轮int countA = 0, countB = 0;// 甲喊 甲划 乙喊 乙划for (int i = 0; i < n; i++) {String[] temp = br.readLine().split("\\s");int total = Integer.valueOf(temp[0])+Integer.valueOf(temp[2]);if(Integer.valueOf(temp[1]) == total && Integer.valueOf(temp[3]) != total)countB++;if(Integer.valueOf(temp[3]) == total && Integer.valueOf(temp[1]) != total)countA++;}  System.out.println(countA+" "+countB);}
}

1047 编程团体赛

思路一(测试点1运行超时,轻易别用HashMap吧):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Main {public static void main(String[] args) throws IOException {// 队伍编号-队员编号 成绩,其中队伍编号为 1 到 1000 的正整数,队员编号为 1 到 10 的正整数,成绩为 0 到 100 的整数。BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.valueOf(br.readLine().trim());HashMap<Integer, Integer> teamGrade = new HashMap<>();int topTeam = 0;teamGrade.put(0, 0);for (int i = 0; i < n; i++) {String[] temp = br.readLine().trim().split("\\s+|\\-");int teamID = Integer.valueOf(temp[0]);int grade = Integer.valueOf(temp[2]);teamGrade.computeIfPresent(teamID, (k, v) -> v + grade);teamGrade.putIfAbsent(teamID, grade);if(teamGrade.get(teamID) > teamGrade.get(topTeam))topTeam = teamID;}// 在一行中输出冠军队的编号和总成绩System.out.println(topTeam+" "+teamGrade.get(topTeam));}
}

思路二(没啥说的,很简单):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {// 队伍编号-队员编号 成绩,其中队伍编号为 1 到 1000 的正整数,队员编号为 1 到 10 的正整数,成绩为 0 到 100 的整数。BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.valueOf(br.readLine().trim());int[] team = new int[1001];int topTeam = 0;for (int i = 0; i < n; i++) {String[] temp = br.readLine().trim().split("\\s+|\\-");int teamID = Integer.valueOf(temp[0]);int grade = Integer.valueOf(temp[2]);team[teamID] += grade;if (team[teamID] > team[topTeam])topTeam = teamID;}// 在一行中输出冠军队的编号和总成绩System.out.println(topTeam + " " + team[topTeam]);}
}

1048 数字加密

本题就是最气人的文字游戏类型……根本就没有说清楚。
这里注意,最终结果的数字长度等于A、B中更长的那一个,因而当B长度小于A时必须补位,但是当A长度小于B时没有必要,因为位的计算结果不会改变。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] temp = br.readLine().split("\\s+");String A = temp[0];StringBuilder B = new StringBuilder(temp[1]);int a = A.length() - 1;int b = B.length() - 1;char[] sub = new char[ Math.abs(a - b) ];Arrays.fill(sub, '0');if(b < a) {B.insert(0, sub);     // B长度小于A时补位b = a;}int index = 1;String sample = "0123456789JQK";while (a >= 0 && b >= 0) {if ((index++) % 2 == 1) {int odd = (B.charAt(b) - '0' + A.charAt(a--) - '0') % 13;B.setCharAt(b--, sample.charAt(odd));} else {int even = B.charAt(b) - A.charAt(a--);if (even < 0)even = even + 10;B.setCharAt(b--, sample.charAt(even));}}System.out.println(B.toString());}
}

1049 数字的片段和(测试点2、3运行超时)

数学题找规律,考察效率,很水,java劝退。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());double[] num = new double[n];String[] temp = br.readLine().split("\\s+");double total = 0;for (int i = 0; i < num.length; i++) {num[i] = Double.parseDouble(temp[i]);total += (n--) * (i + 1) * num[i];}System.out.printf("%.2f\n",total);}
}

1050 螺旋矩阵(测试点6、7运行超时)

重点在于找规律,后两个测试点运行超时,可以看看用C/C++写的:C

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int len = Integer.parseInt(br.readLine());int[] num = new int[len];String[] temp = br.readLine().split("\\s+");for (int i = 0; i < len; i++)num[i] = Integer.parseInt(temp[i]);Arrays.sort(num);int n = (int) Math.sqrt(len), m = 0; // 从开方的floor值递减匹配n,并找到mwhile (true) {if (len % n == 0) {m = len-- / n;break;}n--;}int[][] spiral = new int[m + 1][n + 1];int col = n, row = m, count = 1;       // count为当前列与行的起始边,col和row是列与行的范围while (len >= 0) {if (col == (n + 1) / 2 && n % 2 == 1) {      // 宽为奇数时,中心不成圈的部分for (int i = count; i <= row; i++)spiral[i][col] = num[len--];break;}for (int i = count; i < col; i++)        // 最上行spiral[count][i] = num[len--];for (int i = count; i < row; i++)        // 最右列spiral[i][col] = num[len--];for (int i = col; i > count; i--)        // 最下行spiral[row][i] = num[len--];for (int i = row; i > count; i--)        // 最左列spiral[i][count] = num[len--];count++;row--;col--;}for (int i = 1; i <= m; i++) {for (int j = 1; j < n; j++) {System.out.printf("%d ", spiral[i][j]);}System.out.printf("%d\n", spiral[i][n]);}}
}

还有一篇java写的可以过测试点6,对上下左右的边都设置了boolean判断:Java

1051 复数乘法

首先进行运算,对于复数a+bi,a = r×cosp,b = r×sinp
那么对于结果的A+Bi,就有 (a1a2 - b1b2) + (a1b2 + b1a2) i
特别注意!由于保留小数点后两位,小于-0.005的就会约成0.00,不注意的话就会输出-0.00

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] temp = br.readLine().split("\\s+");double r1 = Double.parseDouble(temp[0]);double p1 = Double.parseDouble(temp[1]);double r2 = Double.parseDouble(temp[2]);double p2 = Double.parseDouble(temp[3]);double a1 = r1 * Math.cos(p1);double b1 = r1 * Math.sin(p1);double a2 = r2 * Math.cos(p2);double b2 = r2 * Math.sin(p2);double A = a1 * a2 - b1 * b2;double B = a1 * b2 + b1 * a2;if(Math.abs(A) < 0.005)A = 0;if(Math.abs(B) < 0.005)B = 0;if (B < 0)System.out.printf("%.2f%.2fi", A, B);else if (B >= 0)System.out.printf("%.2f+%.2fi", A, B);}
}

1052 卖个萌(测试点0、1答案错误)

这题我觉得是网站的java答案或者编译器问题……花费了太久的时间,把C++的翻写成了java还是过不了。唯一要注意的就是上下边界,防止输入负数。题不难,如果有朋友用java卡了,不建议纠结太久(在CSDN上并没有找到Java本题能AC的)。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String temp1 = br.readLine().trim();String temp2 = br.readLine().trim();String temp3 = br.readLine().trim();ArrayList<String> hands = new ArrayList<>(); hands.add("");ArrayList<String> eyes = new ArrayList<>(); eyes.add("");ArrayList<String> mouth = new ArrayList<>(); mouth.add("");//提取emoji元素buildFactor(hands,temp1);buildFactor(eyes,temp2);buildFactor(mouth,temp3);int k = Integer.parseInt(br.readLine().trim());    boolean[] legel = new boolean[k];  // 输入合法性Arrays.fill(legel, true);int[][] face = new int[k][5];     // 输入的用户要求for (int i = 0; i < k; i++) {String[] temp4 = br.readLine().trim().split("\\s+");for (int j = 0; j < 5; j++) {face[i][j] = Integer.parseInt(temp4[j]);if(face[i][j] < 1 || face[i][j] > 10)legel[i] = false;}}for (int i = 0; i < k; i++) {if (legel[i] == true && face[i][0] < hands.size() && face[i][4] < hands.size() && face[i][1] < eyes.size()&& face[i][3] < eyes.size() && face[i][2] < mouth.size())System.out.print(hands.get(face[i][0]) + "(" + eyes.get(face[i][1]) + mouth.get(face[i][2])+ eyes.get(face[i][3]) + ")" + hands.get(face[i][4]));elseSystem.out.print("Are you kidding me? @\\/@");System.out.println();}}private static void buildFactor(ArrayList<String> factors, String temp) {int index = 0;while(index < temp.length()) {StringBuilder str = new StringBuilder(""); if(temp.charAt(index)=='[') {index++;while(true) {str.append(temp.charAt(index++));if(temp.charAt(index) == ']')break;}factors.add(str.toString());continue;}index++;}}}

1053 住房空置率

需要注意的要点:

  1. 审题,观察期阈值D是针对观察期K而言的;
  2. 边界值判断,“超过”、“低于”;
  3. 百分号的输出。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] temp1 = br.readLine().trim().split("\\s+");int n = Integer.parseInt(temp1[0]);            // 住房总数double e = Double.parseDouble(temp1[1]);    // 电量阈值int d = Integer.parseInt(temp1[2]);         // 观察期阈值int possible = 0, empty = 0;for (int j = 0; j < n; j++) {String[] temp2 = br.readLine().trim().split("\\s+");int k = Integer.parseInt(temp2[0]);       // 观察期int count = 0;                           // 低于电量阈值的天数if (k > d) {                         // 观察期是否大于观察期阈值for(int m = 1; m <= k; m++) {if(Double.parseDouble(temp2[m]) < e)count++;if(count > k / 2) {              // 符合“空置”提前结束,提高效率empty++;break;}}} else {for(int m = 1; m <= k; m++) {if(Double.parseDouble(temp2[m]) < e)count++;if(count > k / 2) {          // 符合“可能空置”提前结束,提高效率possible++;break;}}}}System.out.printf("%.1f%% %.1f%%", (double) possible * 100 / n, (double) empty * 100 / n);}}

1054 求平均值

又是一道不难但是麻烦的题,难点在于判断输入合法性,思路如下:

  • 先用小数点分裂字符串(注意要用转义字符):
  1. 字符串数组长度==1,无小数点,进行整数部分判断&取值范围判断
  2. 字符串数组长度==2,有一个小数点,进行整数部分&小数部分判断&取值范围判断
  3. 字符串数组长度>2,多于一个小数点,一定不合法
  • 整数部分判断:
  1. 首位:数字或负号,且为负号时整数部分长度大于1,不满足则不合法
  2. 非首位:数字,不满足则不合法
  • 小数部分判断:
  1. 长度不能超过2(精确度判断),超过则不合法
  2. 逐位:数字,不满足则不合法
  • 取值范围判断:[-1000,1000]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());String[] temp = br.readLine().trim().split("\\s+");int legalCount = 0;double total = 0;for (int i = 0; i < n; i++) {if (legal(temp[i])) {legalCount++;total += Double.parseDouble(temp[i]);} else {System.out.println("ERROR: " + temp[i] + " is not a legal number");}}if (legalCount == 0)System.out.println("The average of 0 numbers is Undefined");else if (legalCount == 1)System.out.printf("The average of 1 number is %.2f\n", total);elseSystem.out.printf("The average of " + legalCount + " numbers is %.2f\n", total / legalCount);}private static boolean legal(String s) {boolean flag = true;String[] temp = s.split("\\.");if (temp.length > 2)                                       // 多于一个小数点时不合法flag = false;else {                                                      // 含零或一个小数点时    for (int i = 0; i < temp[0].length(); i++) {          // 整数部分逐位判断char ch = temp[0].charAt(i);if ((i == 0 && Character.isDigit(ch) == false && ch != '-') // 首位不是负号也不是数字不合法|| (temp[0].length() == 1 && ch == '-')               // 首位是负号但长度为1不合法|| (i > 0 && Character.isDigit(ch) == false)) {      // 非首位也非数字不合法flag = false;break;}}}if (temp.length == 2) {                                     // 有小数部分时if (temp[1].length() > 2)                               // 精确度判断flag = false;else {for (int i = 0; i < temp[1].length(); i++)            // 逐位判断是否为数字if (i > 0 && Character.isDigit(temp[1].charAt(i)) == false) {flag = false;break;}}}if (flag == true)                                            // 取值范围合法性判断flag = Math.abs(Double.parseDouble(s)) > 1000 ? false : true;return flag;}}

1055 集体照

题目要求虽略显复杂,但是只要细心读题就能够理解,因为各种条件都给的很清晰~

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.IOException;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] temp1 = br.readLine().trim().split("\\s+");int n = Integer.parseInt(temp1[0]);        // n人int k = Integer.parseInt(temp1[1]);       // k排int m = Math.floorDiv(n, k);int lastLine = n - (k - 1) * m;PhotoPeople[] pp = new PhotoPeople[n];  // 初始化拍照的人for(int i = 0; i < n; i++) {String[] temp2 = br.readLine().trim().split("\\s+");pp[i] = new PhotoPeople(temp2[0],Integer.parseInt(temp2[1]));}Arrays.sort(pp);  // 升序排序String[][] pos = new String[k + 1][];  // 初始化站位pos[k] = new String[lastLine + 1];for(int i = 1; i < k; i++)pos[i] = new String[m + 1];int index = n - 1;                        // 身高逆序输出姓名for(int i = k; i >= 1; i--) {int mid = (pos[i].length - 1) / 2 + 1;       // 确定中间位置int j = mid;                              // 从中间位置开始安排int next = 1;                              // 步长while(j > 0 && j < pos[i].length) {pos[i][j] = pp[index--].name;if(j >= mid)                            // 中间或在右侧时下一个在左侧j = mid - next;elsej = mid + (next++);                 // 左侧时下一个在右侧并且步长+1}}for(int i = k; i >= 1; i--) {                 // 输出队伍for(int j = 1; j < pos[i].length - 1; j++) {System.out.print(pos[i][j]+" ");}System.out.println(pos[i][pos[i].length - 1]);}}}
class PhotoPeople implements Comparable<PhotoPeople>{String name;int height;public PhotoPeople() {}public PhotoPeople(String name, int height) {this.name = name;this.height = height;}@Overridepublic int compareTo(PhotoPeople o) {          // 重写比较方式if(this.height > o.height)return 1;else if(this.height == o.height)return -this.name.compareTo(o.name);   // 身高相同按照姓名字典序elsereturn -1;}
}

1056 组合数的和

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] temp = br.readLine().trim().split("\\s+");int n = Integer.parseInt(temp[0]);int total = 0;for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {if(i != j) {                  // 和除了自身外的其他数字进行组合total += Integer.parseInt(temp[i]+temp[j]);}}}System.out.println(total);}
}

1057 数零壹

水题,但是需要注意一点:测试点2是输出为0的情况,此时需要打印“0 0”,而不是“1 0”。并不理解为什么……明明0也是1个0啊,经验教训就是,有个别测试点过不了时,试试边界值:如0、最小值或最大值。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str = br.readLine().trim().toLowerCase();int total = 0;                                    // 加和for (int i = 0; i < str.length(); i++) {Character ch = str.charAt(i);if (ch >= 'a' && ch <= 'z') {              // 判断是否为字母total += ch - 'a' + 1;}}String bi = Integer.toBinaryString(total);      // 转换成二进制int count = 0;                                    // 对0计数for (int i = 0; i < bi.length(); i++) {if (bi.charAt(i) == '0')count++;}if (bi.equals("0"))                                // 输出为0时System.out.println("0 0");elseSystem.out.println(count + " " + (bi.length() - count));}}

1058 选择题

用字符串匹配做了答案检查,测试点3一直运行超时。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] str = br.readLine().trim().split("\\s+");int n = Integer.parseInt(str[0]); // <=1000 学生数int m = Integer.parseInt(str[1]); // <=100 多选题个数String[] q = new String[m + 1];     // 每个问题的信息for (int i = 1; i <= m; i++)q[i] = br.readLine().trim();int[] countQ = new int[m + 1];      // 每个问题的误答数int[] grade = new int[n + 1];      // 每个问题的误答数for (int i = 1; i <= n; i++) {grade[i] = 0;                  // 当前学生的成绩String s = br.readLine().trim();String[] temp = s.substring(1, s.length() - 1).split("\\) \\(");    // 读入此学生m个问题答案for (int j = 0; j < temp.length; j++) {if (temp[j].equals(q[j + 1].substring(4)))grade[i] += q[j + 1].charAt(0) - '0';          // 正答给学生加分elsecountQ[j + 1]++;                            // 误答给计数器加1}}for(int i = 1; i <= n; i++)System.out.println(grade[i]);                       // 学生成绩逐行输出int countMax = 0;for (int x : countQ) {if (x >= countMax)countMax = x;}if (countMax == 0)System.out.println("Too simple");else {System.out.print(countMax);for (int i = 1; i <= m; i++) {if (countQ[i] == countMax)System.out.print(" " + i);}}}
}

字符串比对的函数比较耗时,于是为了AC老老实实地建数组

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StreamTokenizer;public class Main {static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static int nextInt() throws IOException { st.nextToken(); return (int) st.nval; }static String next() throws IOException { st.nextToken(); return st.sval;}public static void main(String[] args) throws IOException {int n = nextInt(); // 学生人数int m = nextInt(); // 多选题的个数int[] point = new int[m + 1]; // 每题的分值int[] bingo = new int[m + 1]; // 正确选项的个数boolean[][] answer = new boolean[m + 1][]; // 正确为真,错误为假for (int i = 1; i <= m; i++) {point[i] = nextInt();answer[i] = new boolean[nextInt()];bingo[i] = nextInt();for (int j = 0; j < bingo[i]; j++) {int index = next().charAt(0) - 'a';answer[i][index] = true;}}int[] count = new int[m + 1];        // 每道题的错误次数for (int i = 1; i <= n; i++) {int grade = 0;                 // 此学生分数for (int j = 1; j <= m; j++) {st.nextToken();            // 跳过左括号int oCount = nextInt();        // 学生作答个数boolean flag = true;      // 是否有误选while (true) {String str = next();if (str == null)       // 读到右括号时会得到nullbreak;else {int index = str.charAt(0) - 'a';if (answer[j][index] == false)flag = false;}}if (flag && oCount == bingo[j])    // 没有误选且作答与正选个数一致才得分grade += point[j];elsecount[j]++;}System.out.println(grade);}int maxV = 0;for (int i = 1; i <= m; i++)if (count[i] > maxV)maxV = count[i];      // 找出错误次数最多的if (maxV == 0)System.out.println("Too simple");else {System.out.print(maxV);for (int i = 1; i <= m; i++)if (count[i] == maxV)System.out.print(" " + i);}}
}

1059 C语言竞赛(测试点1、2运行超时)

水题,java劝退

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());ArrayList<String> player = new ArrayList<>();for(int i = 0; i < n; i++)player.add(br.readLine());int k = Integer.parseInt(br.readLine());          // ID查询ArrayList<String> checkList = new ArrayList<>();while(k-- > 0) {String id = br.readLine();if(player.contains(id)) {if(checkList.contains(id)){System.out.println(id+": Checked");} else {if(player.get(0).equals(id)){System.out.println(id+": Mystery Award");} else {if(isPrime(id))System.out.println(id+": Chocolate");elseSystem.out.println(id+": Minion");}}} else {System.out.println(id+": Are you kidding?");}checkList.add(id);}}private static boolean isPrime(String str) {double id = Double.parseDouble(str);for(int i = 2; i <= (int) Math.sqrt(id); i++) {if(id % i == 0)return false;}return true;}}

1060 爱丁顿数

在PAT乙级的25分题目中算水的,可以暴力按照天数递减找E,也可以排序后进行比较。如下代码注释中有具体思路。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
public class Main {static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static int nextInt() throws IOException{in.nextToken(); return (int) in.nval;}public static void main(String[] args) throws IOException {int n = nextInt();                      // n天int[] cycling = new int[n];for (int i = 0; i < n; i++)cycling[i] = nextInt();              // 每天的骑行距离Arrays.sort(cycling);                 // 升序排序boolean flag = false;                   // 是否找到符合条件的输出for (int i = n - 1; i >= 0; i--) {       // 降序查找if (cycling[i] <= n - i) {System.out.println(n - i - 1); // 第i+1天的骑行距离<=n-i,E=n-i-1flag = true;break;}}if (!flag)                              // 当最短骑行距离大于总天数,E=nSystem.out.println(n);}
}

【Java】PAT乙级真题全记录(三)41到60题相关推荐

  1. 【PTA】 PAT乙级真题,95题(C++,AC代码)

    PAT乙级真题95题 标号 标题 分数 通过数 提交数 通过率 1001 害死人不偿命的(3n+1)猜想 15 109558 309119 0.35 1002 写出这个数 20 71739 28156 ...

  2. PAT乙级真题1058 || 选择题(详解,C/C++示例,测试点分析)

    [欢迎关注微信公众号:计算机黑科学大全,对话框回复:PAT乙级真题]获取全部真题详解及代码示例 个人博客地址:https://mzwang.top 选择题 题目描述: 批改多选题是比较麻烦的事情,本题 ...

  3. 1085 PAT单位排行 (25分)-PAT乙级真题-C++实现

    1085 PAT单位排行 (25分)-PAT乙级真题-C++实现 题目描述: 每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整 ...

  4. PAT乙级真题1089 || 狼人杀-简单版(详解,C/C++示例,测试点分析)

    [欢迎关注微信公众号:计算机黑科学大全,在对话框回复:PAT乙级真题]获取全部真题详解及代码示例,邀请大家加入PAT算法刷题交流qq群:821388108 个人博客:https://mzwang.to ...

  5. 「PAT乙级真题解析」Basic Level 1018 锤子剪刀布 (问题分析+完整步骤+伪代码描述+提交通过代码)

    乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范.从小白开始逐步掌握用编程解决问题. PAT乙级BasicLevelPractice 1018 锤子剪刀布 问题分析 题目要求统计 ...

  6. 1051. 复数乘法 (15)-PAT乙级真题

    复数可以写成(A + Bi)的常规形式,其中A是实部,B是虚部,i是虚数单位,满足i2 = -1:也可以写成极坐标下的指数形式(R*e(Pi)),其中R是复数模,P是辐角,i是虚数单位,其等价于三角形 ...

  7. 「PAT乙级真题解析」Basic Level 1033 旧键盘打字 (问题分析+完整步骤+伪代码描述+提交通过代码)

    乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范.从小白开始逐步掌握用编程解决问题. PAT乙级BasicLevelPractice 1033 问题分析 题目设定了一个场景: 有 ...

  8. 「PAT乙级真题解析」Basic Level 1072 开学寄语 (问题分析+完整步骤+伪代码描述+提交通过代码)

    乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范.从小白开始逐步掌握用编程解决问题. PAT乙级BasicLevelPractice 1072 开学寄语 问题分析 题设要求查找学 ...

  9. 「PAT乙级真题解析」Basic Level 1053 住房空置率 (问题分析+完整步骤+伪代码描述+提交通过代码)

    乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范.从小白开始逐步掌握用编程解决问题. PAT乙级BasicLevelPractice 1053 问题分析 题设要求统计符合住房空置 ...

最新文章

  1. 内存管理之虚拟页式分配
  2. python怎么玩pdf_如何使用Python玩转PDF各种骚操作?
  3. 解决IE6透明PNG图片的代码
  4. linux nginx 安装
  5. bootstrap 辅助类
  6. JQuery Dialog UI按钮文字国际化
  7. Spring安全依赖查找
  8. 创业基础(第7章 创业计划) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  9. sqlplus 命令大全
  10. 设计模式经典书籍推荐
  11. 开发erp管理系统的好处
  12. 播布客全部视频教程汇总
  13. 中文ISBN公开信息查询接口
  14. 如何设置正确的dns服务器地址,dns服务器地址如何设置
  15. pytho_抓取下载音乐歌曲
  16. Mac OS X 10.13.6升级到更高版本的方法
  17. Get智能写作 | 掌握这5个小技巧,让你的写作飞起来
  18. 用计算机处理图像属于啥技术,计算机技术在图像处理中的应用
  19. Python pickle 模块简介
  20. json引发的惨案--------饿百 同步骑手状态接口

热门文章

  1. 移动手机为什么还有话费,就停机了,和客服的谈话
  2. 如何配置Office 365通过SecurityGateway路由出站邮件
  3. 东炜庭电机:数字化管理赋能,全面夯实行业竞争优势
  4. 通用串行总线控制器:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备
  5. 数字IC设计工具教程——VCS常用命令
  6. 关闭brew自动更新
  7. 家用小型投影仪什么牌子好?推荐家用投影仪
  8. 宝塔nginx 开启基于thinkphp6 的pathinfo模式
  9. 读:沧月《似是故人来》
  10. 股票实时数据接口 香港股市详细查询