A.解码
题目:
小明有一串很长的英文字母,可能包含大写和小写。
在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。 例如,连续的 55 个 a,即 aaaaa,小明可以简写成 a5(也可能简写成 a4a、aa3a 等)。
对于这个例子:HHHellllloo,小明可以简写成 H3el5o2。为了方便表达,小明不会将连续的超过9个相同的字符写成简写的形式。
现在给出简写后的字符串,请帮助小明还原成原来的串。
例如:
输入H3el5o2
输出HHHellllloo
思路:
0-9的ASCII码是48-57。遍历数组,如果是字母,就放到另一个字符串里面,如果该字符是数字就转化为整型,然后将前面的字母循环这个数字-1次放入新数组。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
String str2 = "";
for(int i = 0;i<str.length();i++) {
if(str.charAt(i)>=48&&str.charAt(i)<=57) {
String ch = str.charAt(i)+"";
int n = Integer.parseInt(ch);
for(int j = 0;j < n-1;j++) {
str2 += str.charAt(i-1);
}
}else {
str2+=str.charAt(i);
}
}
System.out.println(str2);
}
}
B.成绩分析
题目:
小蓝给学生们组织了一场考试,卷面总分为 100分,每个学生的得分都是一个 0 到 100 的整数。
请计算这次考试的最高分、最低分和平均分。
思路:
就是求最大值,最小值和平均值
代码:
点击查看代码
import java.util.Scanner;
public class MainB {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
int max,min;
double avg,sum;
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
}
max = 0;
min = 100;
sum = 0;
for(int i = 0;i < n;i++) {
if(arr[i]>max) {
max = arr[i];
}
if(arr[i]<min) {
min = arr[i];
}
sum+=arr[i];
}
avg = sum/n;
System.out.println(max);
System.out.println(min);
System.out.printf("%.2f",avg);
}
}
C.整除序列
题目:
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。
思路:
循环将这个数除2并输出,直到除到1为止
代码:
点击查看代码
import java.util.Scanner;
public class MainC {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
long num = n;
while(num>=1) {
System.out.print(num+" ");
num = num/2;
}
}
}
D.日期识别:
题目:
小蓝要处理非常多的数据, 其中有一些数据是日期。
在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。
英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写, 日期小于 1010 时要补前导 00。11 月到 1212 月英文的前三个字母分别是 Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec。
数字形式直接用两个整数表达,中间用一个空格分隔,两个整数都不写前 导 0。其中月份用 11 至 1212 分别表示 11 月到 1212 月。
输入一个日期的英文形式, 请输出它的数字形式。
例如:输入Feb08,输出28
思路:
因为是字符串的格式是固定的,可以先将后面两个字符转化为数字,得到日期。声明一个字符串数组,里面是按顺序排列的12个月的英文,进行匹配输出月份即可。
代码:
点击查看代码
import java.util.Scanner;
public class MainD {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int day;
String str = scanner.next();
String[] str1 =new String[] {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
String dstr = "";
for(int i = 3;i < str.length();i++) {
dstr+=str.charAt(i);
}
day = Integer.parseInt(dstr);
for(int i = 0;i < 12 ;i++) {
if(str.contains(str1[i])) {
System.out.println(i+1+" "+day);
break;
}
}
}
}
E.回文日期
题目:
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 yyyymmdd 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年12 月12 日。算不上“千年一遇”,顶多算“千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
说明:
对于所有评测用例,10000101 <= N <= 89991231,保证 N 是一个合法日期的 8 位数表示。
!!!注意把题目看清楚,题目说输入最大是89991231,所以应该考虑的范围是该数到99999999。
思路:
这道题首先想的是一天一枚举,这样是会超时的,后面想到可以一年一枚举,判断它是不是合法回文日期就行了。我们可以将前面四个数分离出来枚举,因为后面四个数就是翻转过来的,只需要判断后四位数的翻转是不是合法日期就行。判断合法日期的时候也要注意闰年和平年。
代码:
点击查看代码
import java.util.Scanner;
public class MainE2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for(int i = n/10000+1;i<9999;i++) {
if(!IsLegel(i)) {
continue;
}
String str = i+"";
String str1 = "";
for(int j = 3;j >= 0;j--) {
str1 += str.charAt(j);
}
str+=str1;
System.out.println(str);
break;
}
for(int i = n/10000+1;i<8999;i++) {
if(!IsLegel(i)) {
continue;
}
String str = i+"";
String str1 = "";
for(int j = 3;j >= 0;j--) {
str1 += str.charAt(j);
}
str+=str1;
if(str.charAt(0)==str.charAt(7)&&str.charAt(7)==str.charAt(2)&&str.charAt(2)==str.charAt(5)) {
if(str.charAt(1)==str.charAt(3)&&str.charAt(3)==str.charAt(4)&&str.charAt(4)==str.charAt(6)&&str.charAt(0)!=str.charAt(1) ) {
System.out.println(str);
break;
}
}
}
}
public static boolean IsLegel(int n ) {
String str = n + "";
String str1 = "";
String str2 = "";
String str3 = "";
int month = 0,day = 0;
for(int i = 3;i >= 0;i--) {
str1+=str.charAt(i);
}
str2 = ""+str1.charAt(0)+str1.charAt(1);
str3 = ""+str1.charAt(2)+str1.charAt(3);
month = Integer.parseInt(str2);
day = Integer.parseInt(str3);
int[] arr = new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
if((n%4==0&&n%100!=0)||(n%400==0)) {
arr[2] = 29;
}
if(month>12) {
return false;
}else {
if(day>arr[month]) {
return false;
}else {
return true;
}
}
}
}
F.走方格
题目:
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
思路:
代码:
G.乘法表
题目:
九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。
例如, 四进制下的乘法表如下所示:
1 * 1=1
2 * 1=2 2 * 2=10
3 * 1=3 3 * 2=12 3 * 3=21
请注意,乘法表中两个数相乘的顺序必须为样例中所示的顺序,不能随意交换两个乘数。
给定 P,请输出 P 进制下的乘法表。
输入格式
输入一个整数 P。
输出格式
输出 P 进制下的乘法表。P 进制中大于等于 10 的数字用大写字母 A、B、C、⋯ 表示。
例如:
输入:
11
输出:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=11 4*4=15
5*1=5 5*2=A 5*3=14 5*4=19 5*5=23
6*1=6 6*2=11 6*3=17 6*4=22 6*5=28 6*6=33
7*1=7 7*2=13 7*3=1A 7*4=26 7*5=32 7*6=39 7*7=45
8*1=8 8*2=15 8*3=22 8*4=2A 8*5=37 8*6=44 8*7=51 8*8=59
9*1=9 9*2=17 9*3=25 9*4=33 9*5=41 9*6=4A 9*7=58 9*8=66 9*9=74
A*1=A A*2=19 A*3=28 A*4=37 A*5=46 A*6=55 A*7=64 A*8=73 A*9=82 A*A=91
说明/提示
对于所有评测数据, 2≤P≤36。
思路:
题目中输入P,输出P-1行,这个题的提示说2≤P≤36,那就是9个数字+26个英文字母刚好35行。题目说P 进制中大于等于 10 的数字用大写字母 A、B、C、⋯ 表示,也就是说10就要用A来表示了,而且等号的两边只要出现9以上的数字,都是要用字母来表示的,因为字母比较少,我就之间用了一个字符类型的数组,存储的然后根据对应的顺序来使用的。并且在输出的时候都是分类输出的,做这道题的时候一定要细心。
代码:
点击查看代码
import java.util.Scanner;
public class MainH1 {
static char[] ch =new char[] {' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z'};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for(int i = 1;i < n;i++) {
for(int j = 1;j <= i;j++) {
String result = mul(i,j,n);
if(i>=10&&j>=10) {
System.out.printf("%c*%c=%s ",ch[i-9],ch[j-9],result);
}else if(i>=10&&j<10) {
System.out.printf("%c*%d=%s ",ch[i-9],j,result);
}else if(i<10&&j>=10) {
System.out.printf("%d*%c=%s ",i,ch[j-9],result);
}else {
System.out.printf("%d*%d=%s ",i,j,result);
}
}
System.out.println();
}
}
public static String mul(int i,int j,int n) {
int result = i*j;
if(result<n) {
String s = result+"";
if(result>=10) {
s = ch[result-9]+"";
}
return s;
}else {
int a = result / n;
int b = result % n;
String s1 = a+"";
String s2 = b+"";
if(a>=10) {
s1 = ""+ch[a-9];
}
if(b>=10) {
s2 = ""+ch[b-9];
}
return s1+s2;
}
}
}