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