1039 到底买不买 (20分) (Java 题解)

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);
	}
}

相关

PAT - 乙级 - 题解集

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值