兔宝宝刷题:2020蓝桥杯JavaB组省赛

A. 门牌制作(5/5分)


题目:

小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个
字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

思路分析:

比较简单,我兔宝宝秒了。

代码如下:

public class a01_makeCard{
	public static void main(String[] args) {
		int cnt = 0;
		for (int i = 1; i <= 2020; i++) {
			int num = i;
			while(num > 0) {
				if(num % 10 == 2) {
					cnt++;
				}
				num /= 10;
			}
		}
		System.out.println(cnt);
	}
}

B.寻找2020(0/5分)

C.蛇形填数(10/10分)

思路分析:

按照题目要求将蛇形码写下去可以发现第(i,i)和(i+1,i+1)之间的差值存在规律,如上图(斜线所圈数字)。找规律,代码不会写。(●'◡'●)

D.七段码(0/10分)

答案:80

E.排序(15/15分)

答案:jonmlkihgfedcba

思路:

统计各个长度字符串排序需要的最多次数,可以发现当长度为15时最多需要105次排序,然后将第

六个字符移到第一位。

(//̀Д/́/)

代码:(只用于得到对字符串排序需要的次数)

public static int getSortTimes(String s) {//统计用冒泡排序实现对一个字符串排序需要的次数
		//将字符串变成字符数组,再对其操作
		int cnt = 0;
		char[] a = s.toCharArray();
		for (int i = 0; i < a.length - 1; i++) {
			for (int j = 0; j < a.length - 1 - i; j++) {
				if(a[j] > a[j + 1]) {
					char t = a[j];
					a[j] = a[j + 1];
					a[j + 1] = t;
					cnt++;
				}
			}
		}
		return cnt;
	}

F.成绩分析(15/15分)

问题:

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是
一个 0 到 100 的整数。
请计算这次考试的最高分、最低分和平均分。

输入格式

输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出格式

输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

测试样例:

输入:
7
80
92
56
74
88
99
10
输出:
99
10
71.29

这题就比较简单了,代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class 成绩分析 {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        int []arr=new int[n];
        double sum=0;
        for(int i=0;i<n;i++){
            arr[i]=input.nextInt();
            sum+=arr[i];
        }

        Arrays.sort(arr);
        System.out.println(arr[n-1]);
        System.out.println(arr[0]);
        System.out.println(String.format("%.2f",sum/n));
    }
}

G.单词分析(20/20分)

问题:

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

输入格式

输入一行包含一个单词,单词只由小写英文字母组成。

输出格式

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪
个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数

测试样例1

输入:

lanqiao

输出:
a
2

测试样例2

输入:
longlonglongistoolong

输出:
o
6

思路分析:

定义一个长度为26的字符数组,用来存储各字母出现的次数,遍历字符串得到各字母出现的次数,再遍历字符数组得到最大值,最后遍历字符数组得到最大值的索引并转换为字符输出。

代码如下:

import java.util.Scanner;

public class a06_wordAnalysis {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] a = new int[26];
		String s = sc.next();
		for (int i = 0; i < s.length(); i++) {
			int index = s.charAt(i) - 'a';
			a[index]++;
		}
		int max = 0;
		for (int i = 0; i < a.length; i++) {
			if(a[i] > max) {
				max = a[i];
			}
		}
		for (int i = 0; i < a.length; i++) {
			if(a[i] == max) {
				char c = (char)('a' + i);
				System.out.println(c);
				break;
			}
		}
		System.out.println(max);
	}
}

H.数字三角形(20/20分)

样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出
27

答案:27

解题思路:先得到完整数组,然后将数组每个位置上的数字变为到这个数字的路径的最大值,且到最后一行时一定位于中位,则根据最后一行数字个数是奇数还是偶数输出结果

代码如下:

import java.util.Scanner;
public class test1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] arr = new int[n + 1][n + 1];
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j <= i; j++) {
				arr[i][j] = sc.nextInt();
			}
		}
		//求到每个数字路径的最大值,并赋值给这个数字
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j <= i; j++) {
				arr[i][j] += Math.max(arr[i-1][j-1], arr[i-1][j]);
			}
		}
		if(n % 2 == 0) {
			System.out.println(Math.max(arr[n][n/2], arr[n][n/2 + 1]));
		}
		else {
			System.out.println(arr[n][n/2 + 1]);
		}
	}
}

I.子串分值和(10/25分)

题目:

对于一个字符串 S,我们定义 S 的分值 f(S ) 为 S 中出现的不同的字符个
数。例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1。

现在给定一个字符串 S [0…n − 1](长度为 n),请你计算对于所有 S 的非空
子串 S [i… j](0 ≤ i ≤ j < n),f(S [i… j]) 的和是多少。

输入格式

输入一行包含一个由小写字母组成的字符串 S。

输出格式

输出一个整数表示答案。

样例

样例输入:

ababc

样例输出:

28

样例说明:
子串  f值
a     1
ab    2
aba   2
abab  2
ababc 3
 b     1
 ba    2
 bab   2
 babc  3
  a     1
  ab    2
  abc   3
   b     1
   bc    2
    c     1

评测用例规模与约定

对于 20% 的评测用例,1 ≤ n ≤ 10;
对于 40% 的评测用例,1 ≤ n ≤ 100;
对于 50% 的评测用例,1 ≤ n ≤ 1000;
对于 60% 的评测用例,1 ≤ n ≤ 10000;
对于所有评测用例,1 ≤ n ≤ 100000。

解题思路:(40%得分)

得到所有字串,分别得到每个字串的分值(需要创建set集合存储,最后set集合的长度即为当前字子串的分值)。

代码如下:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class test1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		ArrayList<String> list = new ArrayList<>();
		for(int i = 0; i < s.length(); i++) {
			for(int j = i; j < s.length(); j++) {
				String str = s.substring(i,j + 1);
				list.add(str);
			}
		}
		long sum = 0;
		for(String str : list) {
			sum += getSum(str);
		}
		System.out.println(sum);
	}
	//方法用于得到一个字符串的f(S)值
	public static int getSum(String str) {
		Set<String> set = new HashSet<>();
		for(int i = 0; i < str.length(); i++) {
			String s = "" + str.charAt(i);
			set.add(s);
		}
		return set.size();
	}
}

J.装饰珠(0/25分)

总结

总分:95

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值