2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】


  • 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师
  1. 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结
  2. 2014年 第05届 蓝桥杯 Java B组 省赛真题详解及小结
  3. 2015年 第06届 蓝桥杯 Java B组 省赛真题详解及小结
  4. 2016年 第07届 蓝桥杯 Java B组 省赛真题详解及小结
  5. 2017年 第08届 蓝桥杯 Java B组 省赛真题详解及小结
  6. 2018年 第09届 蓝桥杯 Java B组 省赛真题详解及小结
  7. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及小结
  8. 2020年 第11届 蓝桥杯 第1次模拟赛真题详解及小结(校内模拟)【Java版】
  9. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
  10. 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛 2020.7.5】【Java版】
  11. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】
  12. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

目   录

一、试题 A: 指数计算

解法一:使用“计算器”求解

解法二:大整数BigInteger

二、试题 B: 解密

解法一:手工计算

解法二:编程计算 indexOf()+substring()

三、试题 C: 跑步训练

解法一:代码+手工计算

解法二:纯代码

四、试题 D: 合并检测

解法一

解法二

五、试题 E: REPEAT 程序

六、试题 F: 分类计数

七、试题 G: 整除序列

解法一:ArrayList(80分)

解法一:ArrayList改进

解法二:快速位运算(80分)

解法二:快速位运算改进

八、试题 H: 走方格

解法一:dp

解法二

解法三

解法四:dfs

九、试题 I: 字符串编码

解法一(有误!!!)

解法二

十、试题 J: 整数小拼接

小结


试题下载:【链接:https://pan.baidu.com/s/1fQF12Oc-8ndZfXtmWrC26w   提取码:zjxs】

    

一、试题 A: 指数计算

本题总分:5 分

【问题描述】

7 月 1 日是建党日,从 1921 年到 2020 年,中国共产党已经带领中国人民 走过了 99 年。

请计算:7^{2020} mod 1921,其中 A mod B 表示 A 除以 B 的余数。

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【答案】:480

解法一:使用“计算器”求解

    

解法二:大整数BigInteger

package provincialGames_11_2020_1_C;

import java.math.BigInteger;

public class _01_指数计算 {

	public static void main(String[] args) {
		BigInteger a = new BigInteger("7");
		BigInteger MOD = new BigInteger("1921");
		a = a.pow(2020);
		BigInteger b = a.mod(MOD);
		System.out.println(b);
		System.out.println(new BigInteger("7").pow(2020).mod(MOD));
		System.out.println(new BigInteger("7").pow(2020).remainder(MOD));//大整数取模
	}

}

二、试题 B: 解密

本题总分:5 分

【问题描述】

小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:

                                    

例如,将字符串 YeRi 加密可得字符串 EaFn。

小明有一个随机的字符串,加密后为

EaFnjISplhFviDhwFbEjRjfIBBkRyY

(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?

(如果你把以上字符串和表格复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 str.txt,第一行为上面的字符串,后面 52 行依次为表格中的内容。)

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

【答案】:YeRikGSunlRzgDlvRwYkXkrGWWhXaA

解法一:手工计算

【解析】:观察表可得:a->y、A->Y;建议:5个字母 5个字母地一一进行对比。

解法二:编程计算 indexOf()+substring()

package provincialGames_11_2020_1_C;

public class _02_解密 {
	public static void main(String[] args) { // 30个字符
//		String res = "YeRik GSunl RzgDl vRwYk XkrGW WhXaA"; // 未加密【答案】
//		String str = "EaFnj ISplh FviDh wFbEj RjfIB BkRyY"; // 加密后
		String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY"; // 加密后的字符
		char[] arr = str.toCharArray();
		String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 原字符
		String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV"; // 加密后的字符
		String s3 = ""; // 解密后的字符
		for (int i = 0; i < arr.length; i++) {
			int j = s2.indexOf(arr[i]);   // 输出当前字符在加密后字符中的位置
			s3 += s1.substring(j, j + 1); // 找出原字符在此位置对应的字符
		}
		System.out.println(s3);
	}
}

三、试题 C: 跑步训练

本题总分:10 分

【问题描述】

小明要做一个跑步训练。

初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗 600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。

小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循 环。如果某个时刻小明的体力到达 0,他就停止锻炼。 请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。 答案中只填写数,不填写单位。 【答案提交】 这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【答案】:3880

解法一:代码+手工计算

跑31分钟后,还剩700体力。再跑一分钟后,还剩100体力;休息1分钟,还剩400体力。

此时,一共跑了32分钟、剩400体力。即:32*2*60+40

package provincialGames_11_2020_1_C;

public class _01_跑步训练 {

	public static void main(String[] args) {
		int count = 0;
		for (int i = 10000; i >= 0; i -= 300) {
			System.out.println(count++ + " : " + i);
		}
		System.out.println("31 * 2 * 60: " + 31 * 2 * 60);
		System.out.println("32 * 2 * 60: " + 32 * 2 * 60);
	}

}

解法二:纯代码

package provincialGames_11_2020_1_C;

public class _01_跑步训练2 {
	public static void main(String[] args) {
		int target = 10000;
		int count = 0;
		boolean flag = true;
		while (true) {
			// 如果小于600体力并且需要跑步,证明这一分钟跑不完
			if (target < 600 && flag) {
				break;
			}
			if (flag) {
				target -= 600;
				flag = false;
			} else {
				target += 300;
				flag = true;
			}
			count++;
		}
//        System.out.println(count);
		// 最后要求秒数,一分钟花费600体力,一秒花费10体力,体力除10就是剩下的跑步时间
		int time = count * 60 + target / 10;
		System.out.println(time);
	}
}

四、试题 D: 合并检测

本题总分:10 分

【问题描述】

新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。

然而,用于检测的试剂盒紧缺。

为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k 个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k − 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。

A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【答案】:10

解法一

这题数学问题
设总人数为pop,感染率p,每次k人,总市级数sum
sum = ( [pop / k]+1 ) * ( 1+k*p(k+1) )
这里的[ pop / k ] + 1,即pop/k向上取整
[pop/k] + 1 这里由于pop数量较大,所以这里向上取整的1可以忽略,这里直接取了pop/k,即
sum = ( pop / k ) * ( 1 + kp( k+1 ) )
将p代入sum = (pop/k)*( 1+k*0.01( k+1 ) )
sum求导 = ( pop/k ) ( 0.01k-1/k)
可得当k =10时,sum取最小值
所以K = 10。

解法二

原文链接

假设A国有n个人,感染者有n/100
每k个人一组,共n/k组,共用n/k瓶试剂
按照最坏的情况,每多出一个感染者就多用k瓶试剂,
因此共用n/k+(n/100)*k瓶试剂
n是定值,所以求(1/k+k/100)最小
由于a+b>=2√ab
当且仅当a = b时,取等号
即1/k=k/100时,取得最小值
解得k = 10

五、试题 E: REPEAT 程序

本题总分:10 分

【问题描述】

附件 prog.txt 中是一个用某种语言写的程序。

其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。

例如如下片段:

REPEAT 2:

A = A + 4

REPEAT 5:

        REPEAT 6:

                A = A + 5

        A = A + 7

A = A + 8

A = A + 9

该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。

REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。

A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。

请问该程序执行完毕之后,A 的值是多少?

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

prog.txt:内容太多。。。不展示了。。。

题目下载:【链接:https://pan.baidu.com/s/1XgZWE-3sxD7lw0-dhMnPHg   提取码:zjxs】

【答案】:403

package provincialGames_11_2020_1_C;

public class _04_REPEAT程序 {

	public static void main(String[] args) {
		int a = 0, count = 1;
		for (int i = 1; i <= 2; i++) {
			a = a + 4;
			for (int j = 1; j <= 5; j++) {
				for (int k = 1; k <= 6; k++) {
					a = a + 5;
					System.out.println("第" + count++ + "次循环:" + a);
				}
				a = a + 7;
			}
			a = a + 8;
		}
		a = a + 9;
		System.out.println(a);
		System.out.println(count);
	}

}

六、试题 F: 分类计数

时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分

【问题描述】

输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字母,多少个数字。

【输入格式】

输入一行包含一个字符串。

【输出格式】

输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。

【样例输入】

1+a=Aab

【样例输出】

1 3 1

【评测用例规模与约定】

对于所有评测用例,字符串由可见字符组成,长度不超过 100。

package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _06_分类计数 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		char[] temp = str.toCharArray();
		int upper = 0, lower = 0, digit = 0;
		for (int i = 0; i < temp.length; i++) {
			if ('A' <= temp[i] && temp[i] <= 'Z') {
				upper++;
			} else if ('a' <= temp[i] && temp[i] <= 'z') {
				lower++;
			} else if ('0' <= temp[i] && temp[i] <= '9') {
				digit++;
			}
		}
		System.out.println(upper + " " + lower + " " + digit);
	}

}

七、试题 G: 整除序列

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分

【问题描述】

有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。

【输入格式】

输入一行包含一个整数 n。

【输出格式】

输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。

【样例输入】

20

【样例输出】

20 10 5 2 1

【评测用例规模与约定】

对于 80% 的评测用例,1 ≤ n ≤ 10^9。

对于所有评测用例,1 ≤ n ≤ 10^18。

解法一:ArrayList(80分)

package provincialGames_11_2020_1_C;

import java.util.ArrayList;
import java.util.Scanner;

public class _06_整除序列 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(n);
		while (n / 2 > 0) {
			list.add(n / 2);
			n /= 2;
		}
		for (int i = 0; i < list.size(); i++) {
			if (i < list.size() - 1) {
				System.out.print(list.get(i) + " ");
			} else {
				System.out.print(list.get(i));
			}
		}
	}

}

解法一:ArrayList改进

package provincialGames_11_2020_1_CC;

import java.util.ArrayList;
import java.util.Scanner;

public class _06_整除序列_改进 { // 注意超时!!!

	public static void main(String[] args) {
		System.out.println(Integer.MAX_VALUE);
		System.out.println(Long.MAX_VALUE);
		Scanner sc = new Scanner(System.in);
		Long n = sc.nextLong();
		ArrayList<Long> list = new ArrayList<Long>();
		list.add(n);
		while (n / 2 > 0) {
			list.add(n / 2);
			n /= 2;
		}
		for (int i = 0; i < list.size(); i++) {
			if (i < list.size() - 1) {
				System.out.print(list.get(i) + " ");
			} else {
				System.out.print(list.get(i));
			}
		}
	}

}

解法二:快速位运算(80分)

package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _06_整除序列2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		while (n != 0) {
			System.out.print(n + " ");
			n = n >> 1; // 等价于/2,位运算相对快一些
		}
	}

}

解法二:快速位运算改进

package provincialGames_11_2020_1_CC;

import java.util.Scanner;

public class _06_整除序列2_改进 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Long n = sc.nextLong();
		sc.close();
		while (n != 0) {
			System.out.print(n + " ");
			n = n >> 1; // 等价于/2,位运算相对快一些
		}
	}

}

八、试题 H: 走方格

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

【问题描述】

在平面上有一些二维的点阵。 这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。

现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。

注意,如果行号和列数都是偶数,不能走入这一格中。

问有多少种方案。

【输入格式】

输入一行包含两个整数 n, m。

【输出格式】

输出一个整数,表示答案。

【样例输入】

3 4

【样例输出】

2

【样例输入】

6 6

【样例输出】

0

【评测用例规模与约定】

对于所有评测用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。

解法一:dp

package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _08_走方格 {

	public static void main(String[] args) {
		// 输入矩阵的宽高
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		sc.close();
		int[][] dp = new int[n][m];
		dp[0][0] = 1;
		// 这个规律是只能往右下走,也就是只能取左上的值
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				// 第一行一列无需处理
				if (i == 0 && j == 0) {
					continue;
				}
				// 只要不是第一行就可以取上面的
				if (i > 0) {
					dp[i][j] += dp[i - 1][j];
				}
				// 只要不是第一列就可以取左面的
				if (j > 0) {
					dp[i][j] += dp[i][j - 1];
				}
				// 如果是偶数行列不能取值,这里是奇数,因为我的是从0开始,所以偶数的就变成了奇数
				if ((i & 1) == 1 && (j & 1) == 1) {
					dp[i][j] = 0;
				}
			}
		}
		System.out.println(dp[n - 1][m - 1]);
	}

}

解法二

package provincialGames_11_2020_1_CC;

import java.util.Scanner;

public class _08_走方格2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[][] grid = new int[n][m];
		for (int i = 0; i < n; i++) {
			grid[i][0] = 1;
		}
		for (int i = 0; i < m; i++) {
			grid[0][i] = 1;
		}
		for (int i = 1; i < n; i++) {
			for (int j = 1; j < m; j++) {
				if (i % 2 == 1 && j % 2 == 1) {
					continue;
				}
				grid[i][j] = grid[i - 1][j] + grid[i][j - 1];
			}
		}
		System.out.println(grid[n - 1][m - 1]);
	}

}

解法三

原文地址

package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _08_走方格3 {

	static int n, m, count = 0;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		f(1, 1);
		System.out.println(count);
	}

	private static void f(int n1, int m1) {
		if (n1 == n && m1 == m) {
			count++;
			return;
		}
		if (n1 > n || m1 > m)
			return;
		int[][] arr = { { 0, 1 }, { 1, 0 } };
		for (int i = 0; i < 2; i++) {
			int x1 = n1 + arr[i][0];
			int y1 = m1 + arr[i][1];

			if (x1 % 2 == 0 && y1 % 2 == 0)
				continue;
			f(x1, y1);
		}
		return;
	}

}

解法四:dfs

原文地址

package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _08_走方格4 {

	static long[][] dp;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int n = scanner.nextInt();
			int m = scanner.nextInt();
			dp = new long[n + 1][m + 1];
			for (int i = 1; i <= n; i++) {
				for (int j = 1; j <= m; j++) {
					dp[i][j] = -1;
				}
			}
			long res = dfs(1, 1, n, m);
			System.out.println(res);
		}
	}

	private static long dfs(int x, int y, int n, int m) {
		if (x <= 0 || x > n || y <= 0 || y > m || (x % 2 == 0 && y % 2 == 0)) {
			return 0;
		}
		if (dp[x][y] != -1) {
			return dp[x][y];
		}
		if (x == n && y == m) {
			return 1;
		}
		dp[x][y] = dfs(x + 1, y, n, m) + dfs(x, y + 1, n, m);
		return dp[x][y];
	}

}

九、试题 I: 字符串编码

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, ... Z → 26。

这样一个字符串就能被转化成一个数字序列:

比如 ABCXYZ → 123242526。

现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字符串。

【输入格式】

一个数字序列。

【输出格式】

一个只包含大写字母的字符串,代表答案。

【样例输入】

123242526

【样例输出】

LCXYZ

【评测用例规模与约定】

对于 20% 的评测用例,输入的长度不超过 20。

对于所有评测用例,输入的长度不超过 200000。

   ASCII码表

解法一(有误!!!)

注意:此题解有误!!!部分样例不过关!!!请看题解二!!!

package provincialGames_11_2020_1_C;

public class _09_字符串编码2 { // 123242526 -> LCXYZ 【部分样例不过关!】

	public static void main(String[] args) {
		java.util.Scanner sc = new java.util.Scanner(System.in);
		String s = sc.nextLine();
		char c[] = s.toCharArray();
		String b = "";
		for (int i = 0; i < c.length - 1;) {
			int temp = (c[i] - '0') * 10 + (c[i + 1] - '0');
			if (temp <= 26) {
				b += ((char) ((temp - 1) + 'A'));
				c[i] = '0';
				c[i + 1] = '0';
				i += 2;
			} else {
				b += ((char) ((temp / 10 - 1) + 'A'));
				i++;
			}
		}
		if (c[c.length - 1] != '0') {
			s += c[c.length - 1];
		}
		System.out.println(b);
	}

}
/**
// c[c.length - 1]:字符数组的倒数第1个字符
// c[c.length - 2]:字符数组的倒数第2个字符
// c[c.length - 3]:字符数组的倒数第3个字符

	public static void main(String[] args) {
		java.util.Scanner sc = new java.util.Scanner(System.in);
		String s = sc.nextLine();
		char c[] = s.toCharArray();
		String b = "";
		for (int i = 0; i < c.length - 1;) { // 遍历字符数组(最后一个字符并未遍历,防止数组越界!)
			int temp = (c[i] - '0') * 10 + (c[i + 1] - '0'); // 字符转数字
			if (temp <= 26) {
				b += ((char) ((temp - 1) + 'A')); // 将数字转化为对应的字符
				i += 2;
//				c[i] = '0';
//				if (i != c.length - 2) { // 如果字符c[i+1]是字符数组的最后一个字符
//				}
//				c[i + 1] = '0';
			} else {
				b += ((char) ((temp / 10 - 1) + 'A')); // 将数字转化为对应的字符
				i++;
			}
		}
		if (c.length >= 3) { // 符合此条件,则字符数组的最后一个字符一定需要转化为字母
			int temp23 = (c[c.length - 3] - '0') * 10 + (c[c.length - 2] - '0'); // 倒数第2、3个字符合并
			int temp12 = (c[c.length - 2] - '0') * 10 + (c[c.length - 1] - '0'); // 倒数第1、2个字符合并
			if (temp23 >= 26) {
				b += ((char) ((temp23 - 1) + 'A')); // 将数字转化为对应的字符
			}
		}
		System.out.println(b);
	}
*/

解法二

原文链接

package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _09_字符串编码 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		sc.close();
		StringBuilder sb = new StringBuilder();

		int len = s.length();
		char[] num = s.toCharArray();
		for (int i = 0; i < len; i++) {
			// 1开头
			if (num[i] == '1') {
				// 第i+2位是否为0,如果为0,当前位就不能和i+1位合并成一个字母
				if (i < len - 2) {
					// 不为0
					if (num[i + 2] != '0') {
//                        System.out.println((num[i]-'0') * 10 + num[i + 1] + 'A' -1 -'0' );
						sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
						++i;
						// 为0,当前位就不能和i+1位合并成一个字母,(如果合成字母,剩下一个0没办法转换)
					} else {
						sb.append((char) (num[i] - '0' + 'A' - 1));
					}
					// i+2已超过尽头
				} else {
					// 看i+1位是否存在
					if (i < len - 1) {

						sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
						// 不存在,第i位为最后一位
					} else {
						sb.append((char) (num[i] - '0' + 'A' - 1));
					}
					break;
				}
				// 2开头
			} else if (num[i] == '2') {
				// 看存不存在下一位
				if (i < len - 1) {
					// 看下一位是不是小于6,因为字母的大小不能超过26
					if (num[i + 1] <= '6') {
						// 看第i+2位是否存在
						if (i < len - 2) {
							// 看第i+2位是否=0
							if (num[i + 2] != '0') {
								sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
								++i;
								// 为0,当前位就不能和i+1位合并成一个字母,(如果合成字母,剩下一个0没办法转换)
							} else {
								sb.append((char) (num[i] - '0' + 'A' - 1));
							}
							// 不存在的话,就直接添加就行
						} else {
							sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
							break;
						}
						// 如果大于6,证明不能和后一位合并
					} else {
						sb.append((char) (num[i] - '0' + 'A' - 1));
					}
					// 不存在下一位,这一位就直接放进去
				} else {
					sb.append((char) (num[i] - '0' + 'A' - 1));
				}
				// 如果大于2的话,就直接添加就行,字母没有2以上开头的
			} else {
				sb.append((char) (num[i] - '0' + 'A' - 1));
			}
		}
		System.out.println(sb.toString());
	}

	public static char getUppLetter(int num) {
		System.out.println((char) (num));
		return (char) (num);
	}

}

十、试题 J: 整数小拼接

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

给定一个长度为 n 的数组 A1, A2, · · · , An。你可以从中选出两个数 Ai 和 Aj (i 不等于 j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。例如 12 和 345 可以拼成 12345 或 34512 。注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai = Aj 时。

请你计算有多少种拼法满足拼出的整数小于等于 K。

【输入格式】

第一行包含 2 个整数 n 和 K。

第二行包含 n 个整数 A1, A2, · · · , An。

【输出格式】 一个整数代表答案。

【样例输入】

4 33

1 2 3 4

【样例输出】

8

【评测用例规模与约定】

对于 30% 的评测用例,1 ≤ N ≤ 1000, 1 ≤ K ≤ 10^8 , 1 ≤ Ai ≤ 10^4。

对于所有评测用例,1 ≤ N ≤ 100000,1 ≤ K ≤ 10^10,1 ≤ Ai ≤ 10^9。

注意超时!!!

其他解法 

package provincialGames_11_2020_1_C;

import java.util.Scanner;

public class _10_整数小拼接 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int[] array = new int[n];
		for (int i = 0; i < n; i++) {
			array[i] = sc.nextInt();
		}
		int answer = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				String temp = array[i] + "" + array[j];
				Integer sum = Integer.valueOf(temp);
				if (i != j && sum <= k) {
					answer++;
				}
			}
		}
		System.out.println(answer);
	}

}

小结

写题的时候,一定要注意数据的上界与下界!尤其是:10^9、10^18这种上界!!!

  • 16
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
第十一蓝桥杯省赛第二java大学b真题共分为两道编程题和一道综合应用题,以下是真题及解析。 第一题是给定一个字符串,求出字符串中所有数字的总和。首先我们可以使用正则表达式来匹配字符串中的数字,然后将匹配到的数字累加起来即可。可以使用Java中的Pattern和Matcher类来实现正则匹配,具体代码如下: ```java import java.util.regex.*; public class Main { public static void main(String[] args) { String str = "abc123def456ghi789"; int sum = 0; Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(str); while(matcher.find()) { sum += Integer.parseInt(matcher.group()); } System.out.println("数字总和为:" + sum); } } ``` 第二题是给定两个字符串,判断第二个字符串是否是第一个字符串的子串。可以使用Java中的contains()方法来判断一个字符串是否包含另一个字符串。具体代码如下: ```java public class Main { public static void main(String[] args) { String str1 = "abcdefg"; String str2 = "cde"; if (str1.contains(str2)) { System.out.println("第二个字符串是第一个字符串的子串!"); } else { System.out.println("第二个字符串不是第一个字符串的子串!"); } } } ``` 综合应用题是实现一个简单的计算器,根据输入的两个数字和运算符进行相应的运算并输出结果。我们可以使用Java中的Scanner类来获取用户输入的数字和运算符,并根据运算符进行相应的运算。具体代码如下: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入第一个数字:"); int num1 = scanner.nextInt(); System.out.print("请输入第二个数字:"); int num2 = scanner.nextInt(); System.out.print("请输入运算符(+、-、*、/):"); String operator = scanner.next(); double result = 0; switch(operator) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": result = num1 / num2; break; default: System.out.println("无效的运算符!"); } System.out.println("计算结果为:" + result); } } ``` 以上就是第十一蓝桥杯省赛第二java大学b真题及解析的回答,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值