您的位置:首页 > 编程语言 > Java开发

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
  • 收藏
  • 分享
  • 文章举报
长生的梦呓 发布了83 篇原创文章 · 获赞 94 · 访问量 5397 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐