1039 到底买不买 (20分) Java题解 PAT (Basic Level) Practice (中文)- 巧妙开大数组减少代码量
2020-01-11 16:35
701 查看
1039 到底买不买 (20分)
一、题目:
输入样例 1:
ppRYYGrrYBR2258 YrR8RrY
输出样例 1:
Yes 8
输入样例 2:
ppRYYGrrYB225 YrR8RrY
输出样例 2:
No 2
二、解析:
思路1:巧妙开大数组减少代码量
将数组开大一点,把所有字符出现的次数放入数组中。循环判断出A和B字符串中所有出现字符的次数。用数组存放出现过的字符的次数,字符的ASCII码为下标。再判断是否小摊是否足够。
这样比思路2方法少写一些代码。
AC代码1(简单):
import java.util.Scanner; /** * 1039 到底买不买 (20分) * * @思路:循环判断出A和B字符串中所有出现字符的次数。用数组存放出现过的字符的次数,字符的ASCII码为下标。再判断是否小摊是否足够。 * @author: ChangSheng * @date: 2019年12月30日 下午10:32:28 */ public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); int[] arrA = new int[96+26+1]; // 字符的ASCII码为下标。数组大小应该是96+26+1。因为z是122,而大小为122(96+26)的数组下标最大是121。所以需要+1 int[] arrB = new int[96+26+1]; char[] A = s.next().toCharArray(); char[] B = s.next().toCharArray(); for (int i = 0; i < A.length; i++) { arrA[A[i]]++; // 出现过的字符加一 } for (int i = 0; i < B.length; i++) { arrB[B[i]]++; } boolean isEnough = true; // 假设A字符中出现的个数是充足的 int count = 0; for (int i = 0; i < arrA.length; i++) { if (arrA[i] < arrB[i]) { // 数量不足 isEnough = false; count += arrB[i] - arrA[i]; } } if (isEnough) System.out.print("Yes "+(A.length - B.length)); else System.out.print("No "+count); } }
思路2:
创建一个10+26*2的数组,下标0-9表示的是0-9,10-25是A-Z,26-61是a-z。循环判断出A和B字符串中所有字符出现的次数,用数组存放出现过的字符的次数。再循环判断是否B是否足够。
AC代码2: 数组开的小一点,但是代码相对AC代码1要多一些
import java.util.Scanner; /** * 1039 到底买不买 (20分) * * @思路:循环判断出A和B字符串中所有出现字符的次数,用数组存放出现过的字符的次数。再判断是否小摊是否足够。 * @author: ChangSheng * @date: 2019年12月30日 下午10:32:28 */ public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); int[] arrA = new int[10+26*2]; // 下标0-9表示的是0-9,10-25是A-Z,26-61是a-z int[] arrB = new int[10+26*2]; char[] A = s.next().toCharArray(); char[] B = s.next().toCharArray(); for (int i = 0; i < A.length; i++) { if (A[i] >= '0' && A[i] <= '9') { int index = A[i] - 48; arrA[index]++; } else if (A[i] >= 'A' && A[i] <= 'Z') { int index = A[i] - 65 + 10; arrA[index]++; } else if (A[i] >= 'a' && A[i] <= 'z') { int index = A[i] - 97 + 10 + 26; arrA[index]++; } } for (int i = 0; i < B.length; i++) { if (B[i] >= '0' && B[i] <= '9') { int index = B[i] - 48; arrB[index]++; } else if (B[i] >= 'A' && B[i] <= 'Z') { int index = B[i] - 65 + 10; arrB[index]++; } else if (B[i] >= 'a' && B[i] <= 'z') { int index = B[i] - 97 + 10 + 26; arrB[index]++; } } boolean isEnough = true; // 假设A字符中出现的个数是充足的 int count = 0; for (int i = 0; i < arrA.length; i++) { if (arrA[i] < arrB[i]) { // 数量不足 isEnough = false; count += arrB[i] - arrA[i]; } } if (isEnough) System.out.print("Yes "+(A.length - B.length)); else System.out.print("No "+count); } }
- 点赞 1
- 收藏
- 分享
- 文章举报
相关文章推荐
- 1029 旧键盘 (20分) Java题解 PAT (Basic Level) Practice (中文) - Java最简解法
- 1063 计算谱半径 (20分) Java题解 PAT (Basic Level) Practice (中文)
- 1087 有多少不同的值 (20分) Java题解 PAT (Basic Level) Practice (中文)
- 1023 组个最小数 (20分) Java题解 PAT (Basic Level) Practice (中文)
- 浙江大学PAT (Basic Level) Practice (中文)1012数字分类JAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1007素数对猜想JAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1016部分A+BJAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1006换个格式输出整数JAVA实现代码及分析
- PAT (Basic Level) Practice 1039 到底买不买
- Pat(Basic Level)Practice--1039(到底买不买)
- 浙江大学PAT (Basic Level) Practice (中文)1004成绩排名JAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1009说反话JAVA实现代码及分析
- PAT (Basic Level) Practice 1039 到底买不买
- 浙江大学PAT (Basic Level) Practice (中文)1011A+B 和 CJAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1005继续(3n+1)猜想JAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1003我要通过!JAVA代码实现及其规律分析
- 浙江大学PAT (Basic Level) Practice (中文)1001(3n+1)猜想-1002写出这个数JAVA实现代码
- PAT (Basic Level) Practise (中文)1039. 到底买不买(20)
- 浙江大学PAT (Basic Level) Practice (中文)1017A除以BJAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1015德才论JAVA实现代码及分析