目录
一、选择题
A:星期计算
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
已知今天是星期六,请问 20222022 天后是星期几?
注意用数字 11 到 77 表示星期一到星期日。
题解代码
签到题,直接暴力
int sum = 20;
for(int i = 0;i <= 20;i ++)
{
sum =sum % 7;
sum *= 20;
}
System.out.println(sum % 7);
//星期日
B:山
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
这天小明正在学数数。
他突然发现有些止整数的形状像一挫 “山”, 比㓚 123565321、145541123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。
小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022,2022222022][2022,2022222022] 中有 多少个数的形状像一座 “山”。
题解代码
错误示范
public static void main(String[] args) {
int sum = 0;
for(int i = 2022;i <= 2022222022;i ++)
{
if(i == f(i))
sum ++;
}
System.out.println(sum);
}
public static int f(int x)
{
int s = 0;
while(x != 0)
{
int t = 0;
t = x % 10;
s += t;
x /= 10;
s *= 10;
}
return s/10;
}
本题的关键:数位上的数字先单调不减, 后单调不增。
注意三点:
1)将数-->字符串 String.valueOf();
2)比较次数 length/2次
3)比较双方 char[i]与char[chars.length - i - 1]
public class B {
public static void main(String[] args) {
int num = 0;
for(long i = 2022;i <= 2022222022;i ++)
{
if(f(i))
num ++;
}
System.out.println(num);
}
public static boolean f(long x)
{
String s = String.valueOf(x);
char[] chars = s.toCharArray();
for(int i = 0;i < chars.length/2;i ++)
{
if(chars[i] > chars[i + 1] || chars[i] != chars[chars.length - i - 1])
return false;
}
return true;
}
}
//3138
二、编程题
C:字符统计
问题描述
给定一个只包含大写字母的字符串 S, 请你输出其中出现次数最多的字符。
如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。
输入格式
一个只包含大写字母的字符串 S.
输出格式
若干个大写字母,代表答案。
样例输入
BABBACAC
样例输出
AB
评测用例规模与约定
对于 100%100% 的评测用例, 1≤∣S∣≤1000000.
题解代码
首先,arr数组把字符串s读取,sum数组用来统计每个字母出现的次数。然后,遍历sum数组找出字符出现的最大次数max。最后,再次遍历sum数组找到和max相等的字母并输出。
import java.io.*;
import java.util.*;
public class C {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static char arr[] = new char[1000010];
static int sum[] = new int[26];
public static void main(String[] args) throws Exception{
String s = br.readLine();
int n = s.length();
int max = -1;
for(int i = 0;i < n;i ++)
{
arr[i] = s.charAt(i);
sum[arr[i] - '0' - 17] ++;
}
for(int i = 0;i < 26;i ++)
max = Math.max(max, sum[i]);
for(int i = 0;i < 26;i ++)
{
char a = 'A';
if(sum[i] == max)
System.out.print((char)(a + i));
}
}
}
D:最少刷题数
问题描述
小蓝老师教的编程课有 N 名学生, 编号依次是 1…N 。第 i 号学生这学期 刷题的数量是 Ai 。
对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。
输入格式
第一行包含一个正整数 N 。
第二行包含 N 个整数: A1,A2,A3,…,AN.
输出格式
输出 N 个整数, 依次表示第1…N 号学生分别至少还要再刷多少道题。
样例输入
5 12 10 15 20 6
样例输出
0 3 0 0 7
评测用例规模与约定
对于 30% 的数据, 1≤N≤1000,0≤Ai≤1000.
对于 100% 的数据, 1≤N≤100000,0≤Ai≤100000.
题解代码
首先,f存储原数组,g复制一份。然后,对g数组进行排序找到中间值mid。最后,遍历f数组,如果f大于等于mid则不需要再刷题,否则至少再刷mid - f[i] + 1道题。
import java.io.*;
import java.util.*;
public class D {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N = 1000010;
static int n;
static int f[] = new int[N];
static int g[] = new int[N];
public static void main(String[] args) throws Exception{
n = Integer.parseInt(br.readLine());
String ss[] = br.readLine().split(" ");
for(int i = 0;i < n;i ++)
{
f[i] = Integer.parseInt(ss[i]);
g[i] = f[i];
}
Arrays.sort(g,0,n + 1);
int mid = g[n/2 + 1];
for(int i = 0;i < n;i ++)
{
if(f[i] >= mid)
System.out.print(0 + " ");
else
System.out.print((mid - f[i] + 1) + " ");
}
}
}
本题通过率:50%
E:求阶乘
问题描述
满足 N ! 的末尾恰好有 K 个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 −1 。
输入格式
一个整数 K 。
输出格式
一个整数代表答案。
样例输入
2
样例输出
10
评测用例规模与约定
对于 30% 的数据, 1≤K≤10^6.
对于 100% 的数据, 1≤K≤10^18.
题解代码
本题菜鸟看了没什么想法,后来看了别的大佬的题解,意识到求阶乘末尾0的个数其实就是求阶乘因子中5的个数。然后就是整数二分,最终l与r相等找到一个确定数,将其因子中5的个数与k相比,若不相等证明这样的n不存在输出-1。
import java.io.*;
import java.util.*;
public class E {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long k = sc.nextLong();
long l = 0;
long r = Long.MAX_VALUE;
while(l < r)
{
long mid = l + r >> 1;
if(k <= f(mid))
r = mid;
else l = mid + 1;
}
if(f(l) != k)
System.out.println(-1);
else
System.out.println(l);
}
public static long f(long x)
{
long res = 0;
while(x != 0)
{
res += x/5;
x /= 5;
}
return res;
}
}
本题如果将 long l = 1; 通过率:90%
原因:范围是0~Long.MAX-VALUE,如果l = 1,那么记得r = Long.MAX-VALUE - 1.
第一次尝试写题解,若有什么错误,欢迎各位大佬评论区指点交流。