【Java】PAT乙级真题全记录(一)1到20题

新人处子文预警!!博主乃一枚java小白,少不更事之时听闻PAT考出来方便找工作,于是也没多想就走上了这条不归路……

用java考要小心超时哦

你va在很多时候都相当于(C++)- -,这也是很多人喜欢她的原因。然而Java是解释型语言,相对于C/C++程序效率低、执行速度慢。在PAT这种有耗时限制的编程考试中,亲测你va的耗时一般是同质量c++的几十到百倍不等,时间限制在100-400ms不等,有时原本正确的也超时运行了(摊手),不过还好,大部分情况还是问题不大的。

such as 一下
另外一大坑大概是PAT的题目设定,有不少文字游戏嫌疑,主要考察的是逻辑思维以及解决问题的能力。然而名都报了含着泪也是要上考场的……

废话完了开正题(1到20题,无特殊备注则测试点全通过)

1001 害死人不偿命的(3n+1)猜想

import java.util.Scanner;
public class Main {
   
	public static void main(String[] args) {
   
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		int count = 0;
		while (n > 1) {
   
			if (n % 2 == 0)
				n = n / 2;
			else
				n = (n * 3 + 1) / 2;		
			count++;
		}
		System.out.println(count);
	}
}

1002 写出这个数

import java.util.Scanner;
public class Main {
   
	public static void main(String[] args) {
   
		Scanner input = new Scanner(System.in);
		String s = input.nextLine();	// 测试数字已经超过long型上限了,所以用字符串
		int count = 0;
		for (int i = 0; i < s.length(); i++) {
   
			int temp = s.charAt(i) - '0';
			count += temp;
		}
		String s1 = String.valueOf(count); // 结果
		for (int i = 0; i < s1.length(); i++) {
   
			System.out.print(trans(s1.charAt(i)));
			System.out.print(i < s1.length() - 1 ? " " : ""); // 注意格式
		}	
	}
	public static String trans(char c) {
   
		switch(c) {
   
		case '0': return "ling";
		case '1': return "yi";
		case '2': return "er";
		case '3': return "san";
		case '4': return "si";
		case '5': return "wu";
		case '6': return "liu";
		case '7': return "qi";
		case '8': return "ba";
		default: return "jiu";
		}
	}
}

1003 我要通过!

得到“答案正确”的条件是:

  1. 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

这一题需要花点儿心思进行分析,重点在于三个条件并非独立,要把条件2、3联系起来看。比如,按照条件2来看AAPATAA是正确的,带入条件3不难得到AAPAATAAAA也是正确的,此时有a=AA,b=A,c=AA。

import java.util.Scanner;
public class Main {
   
	public static void main(String[] args) {
   
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		boolean[] result = new boolean[n];

		for (int i = 0; i < n; i++) {
   
			String s = input.next(); // 紧接着nextInt()用nextLine()的话首行读不到
			result[i] = isRight(s, result, i); // 判断正误
		}

		for (int i = 0; i < n; i++) {
   
			System.out.println(result[i] ? "YES" : "NO");
		}
	}

	private static boolean isRight(String s, boolean[] result, int i) {
   
		int pcount = 0;
		int acount = 0;
		int tcount = 0;
		for (int j = 0; j < s.length(); j++) {
   
			char c = s.charAt(j); // 条件一:不可有除了P、A、T外的字符
			switch (c) {
   
				case 'P': pcount++; continue;
				case 'A': acount++; continue;
				case 'T': tcount++; continue;
				default: return false;
			}
		}
		
		if(pcount!=1 || tcount!=1 || acount==0)	// 条件二:包含连续PAT的字符串,且其余字符(若存在)只可以是若干个A
			return false;
		/*这部分子串判断是条件二的直译,但是条件三所用的判断式可包含此情况,因而非必要
		String sample = "PAT";
		for (int j = 0; j < s.length() - 2; j++) { 
			String temp = s.substring(j, j + 3);
			if (temp.equals(sample))
				return true;
		}*/
		
		int positionP = s.indexOf('P');
		int positionT = s.indexOf('T');
		if( positionP * (positionT - positionP - 1) != s.length() - 1 - positionT ) // 条件三:要想在P、T中间增加A的个数,必须在左侧增加与右侧相同的内容
			return false;
		
		return true;
	}
}

1004 成绩排名

import java.util.Scanner;
public class Main {
   
	public static void main(String[] args) {
   
		Scanner input = new Scanner(System.in);
		int n = input.nextInt(); // 学生个数
		Student[] st = new Student[n];

		int maxG = 0, minG = 100;
		int minS = 0, maxS = 0;
		for (int i = 0; i < n; i++) {
   
			String name = input.next();
			String studentID = input.next();
			int grade = input.nextInt();
			st[i] = new Student(name, studentID, grade);
			
			if(grade > maxG) {
   
				maxG = grade;
				maxS = i;
			}
			if(grade < minG) {
   
				minG = grade;
				minS = i;
			}
		}
		System.out.println(st[maxS].name+" "+st[maxS].studentID);
		System.out.println(st[minS].name+" "+st[minS].studentID);
	}

}
class Student {
   
	String name;
	String studentID;
	int grade = 0;

	public Student() {
   }

	public Student(String str1, String str2, int g) {
   
		this.name = str1;
		this.studentID = str2;
		this.grade = g;
	}
}

1005 继续(3n+1)猜想

import java.util.*;  
public class Main {
   
	public static void main(String[] args) {
   
		Scanner input = new Scanner(System.in);
		int k = input.nextInt(); // 输入的数字个数
		ArrayList<Integer> digit = new ArrayList<>(); // 存放输入的数字,即待验证的,经过验证最后仅留下关键数字
		ArrayList<Integer> result = new ArrayList<>(); //存放变换过程中的数字,即被覆盖的 
		for (int i = 0; i < k; i++) {
   
			int temp = input.nextInt();
			digit.add(temp);

			while (temp != 1) {
   
				if (temp % 2 == 0)
					temp = temp / 2;
				else
					temp = (temp * 3 + 2) / 2;
				result.add(temp);
			}
		}

		for (int i = digit.size() - 1; i >= 0; i--) {
   
			if (result.contains(digit.get(i)))
				digit.remove(i); // 已被覆盖的移除
		}
		
		Collections.sort(digit); // 由小到大排列
		for(int j = digit.size() - 1; j > 0 ; j--) {
    // 由大到小输出
			System.out.print(digit.get(j)+" ");
		}
		System.out.println(digit.get(0));
	}
}

1006 换个格式输出整数

import java.util.Scanner;
public class Main {
   
	public static void main(String[] args) {
   
		Scanner input = new Scanner(System.in);
		int n = input.nextInt(); // 小于1000的数字

		int nCount = n 
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值