pat题解java,1039 到底买不买 (20分) Java题解 PAT (Basic Level) Practice (中文)- 巧妙开大数组减少代码量...

1039 到底买不买 (20分)

原题链接:传送门

一、题目:

e8b0cc51212262192e5ef409d5e700ab.png

输入样例 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

收藏

分享

文章举报

3d40c076ae264134df5b7dfc76700ac4.png

de638df49f1d5a3342eecff86bcb011e.png

长生的梦呓

发布了83 篇原创文章 · 获赞 94 · 访问量 5397

私信

关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值