目录:
试题 A: 星期计算
试题 B: 山
试题 C: 字符统计
试题 D: 最少刷题数
试题 E: 求阶乘
试题 F: 最大子矩阵
没时间!!!我感觉我最大的问题就是做不完题目!!最后几题也就看了 一眼!!很可惜其实如果暴力的话还是可以拿点分的(被一道题卡了好久)!!所以我建议大家在做题的时候分配好时间,一些写不来的题 或者性价比不高的题就直接跳过!!先做自己会做能拿分,拿多分的题目!!
试题 A: 星期计算本题总分:5分
【问题描述】
已知今天是星期六,请问 20^22天后是星期几?
天后是星期几?注意用数字 1 到 7 表示星期一到星期日。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
🌙 个人思路:
签到题,但是long和int都装不下,直接想到用BigInteger....算出20^22天后对7求余数,算出的余数
再加上6如果大于7则减7否则直接输出.这是我的第一,其实就是暴力(应该有更好的方法)
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BigInteger k = new BigInteger("20");
BigInteger m = new BigInteger("7");
BigInteger l = new BigInteger("6");
for(int i=0;i<=21;++i){
k=k.multiply(k);
}
m=k.mod(m);
System.out.print(m.add(l));
}
}
试题 B: 山本题总分:5分
【问题描述】
这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如 123565321 145541 ,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间 [2022,2022222022] 中有多少个数的形状像一座“山”。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
🌙 个人思路:
我觉得这道题就是要考虑周全,各种可能或不可能的情况都要想清楚,多一个少一个都不对,这里
可以用一个双指针,一个指头,一个指尾,所有的数字长度要么奇数要么偶数,讨论第一种奇数情况,指
针指到同一个数字的时候代表结束,偶数的时候当头指针大于尾指针则为结束条件,此外再保证头指
针所指的那一段单调不减就好了,因为前面如果单调不减,后一段必然单调不增. (虽然运行要一点时
间但是很好想到)
public class Main {
public static void main(String[] args) {
int ans =0;
for(int i=2022;i<=2022222022;++i){
if(check(i)){
System.out.println(i);
ans++;
}
}
System.out.print(ans);
}
private static boolean check(int x) {
// TODO Auto-generated method stub
String k = x+"";
int l = k.length()-1;
if(k.charAt(0)!=k.charAt(l))return false;
for(int i=1,m=l-1;i
试题 C: 字符统计时间限制: 1.0 s 内存限制: 512.0 MB 本题总分:10分
【问题描述】
给定一个只包含大写字母的字符串 S,请你输出其中出现次数最多的字母。
如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母。
【输入格式】
一个只包含大写字母
的字符串 S。
【输出格式】
若干个大写字母,代表答案。
【样例输入】
BABBACAC
【样例输出】
AB
【评测用例规模与约定】
对于 100 %的评测用例,1 ≤ ∣ S ∣ ≤ 10^6
🌙 个人思路:
第一次扫描所有字符保存字符中所有不同的字母,第二次扫描就将保存的字符和字符串依次比
较取到最大值,再利用最大值将不是最大值的字符删掉,剩下的字符就是我们要的字符,然后再排序输
出.感觉还是有点暴力了,但是最多只有26个,所以不会超时(这方法并不是很好,还是很麻烦,虽然过
了)
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sr = new Scanner(System.in);
String s = sr.next();
char[] as = s.toCharArray();
ArrayList kr = new ArrayList();
ArrayList ar = new ArrayList();
for(int i=0;imax)max=sum;
}
for(int i=0;i
试题 D: 最少刷题数时间限制: 1.0 s 内存限制: 512.0 MB 本题总分:10分
【问题描述】
小蓝老师教的编程课有 N 名学生,编号依次是 1 ⋯ N。第 i 号学生这学期刷题的数量是 A i
对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题比他多的学生数不超过刷题比他少的学生数。【输入格式】
第一行包含一个正整数 N NN。
第二行包含 N 个整数: A 1 , A 2 , A 3 ,
【输出格式】
输出 N个整数,依次表示第 1 ⋯ N 号学生分别至少还要再刷多少道题。
【样例输入】
5
12 10 15 20 6
【样例输出】0 3 0 0 7
【评测用例规模与约定】
对于 30 % 的数据,1 ≤ N ≤ 1000 , 0 ≤ A i ≤ 1000
对于 100 % 的数据,1 ≤ N ≤ 100000 , 0 ≤ Ai ≤ 100000。
🌙 个人思路:
这道题的思路其实就是求中位数,只要小于中位数的同学的分数比中位数的分数大1就可以了
(这道题只有75分,我也不知道为啥)
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main{
static int[] num;
static int[] dp;
static int k;
public static void main(String[] args){
Scanner sr = new Scanner(System.in);
int N = sr.nextInt();
int l [] = new int[N];
num= new int[N];
int max =0;
for(int i=0;imax)max=num[i];
}
dp = new int[max+1];
Arrays.sort(num);
k =num.length;
for(int i=0;i
试题 E: 求阶乘时间限制: 1.0 s 内存限制: 512.0 MB 本题总分:15 分
【问题描述】
满足 N ! 的末尾恰好有 K个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 − 1 。
【输入格式】
一个整数 K。
【输出格式】
一个整数代表答案。
【样例输入】
2
【样例输出】
10【评测用例规模与约定】
对于 30 % 的数据,1 ≤ K ≤ 10 1 ≤ K ≤ 10^6
对于 100 % 的数据,1 ≤ K ≤ 10 ^18
🌙 个人思路:(看了包会)
这题跟百度以前的面试题有点像(1...100!有几个0),但这题要反推 ,他要求刚好有k个0的N!中N
的最小值,那么0是由乘以10所得到的,那么10又是怎么来的呢?是由2*5得到的对吧=>那么这道题的
就可以转化为1..N的阶乘谁能贡献出2和5,2是由 0 2 4 6 8来的所以能出5 必然有2 所以2 一定是够
用的 那么问题就是能产生5的数了 能产生5的数 有5 25 125 那么我们只要统计好 有几个数能产生5
就好了。现在目标是产生k个0的最小数,那么可以从小往大递推,比如2个0可以由两个5的因数构成
,也可以由因数为25的数构成,那么我们可以以5为增率递加数据,判断新得到的数字能贡献几个5就可
以了.(再优化的方法要用二分,单纯写只有35分)
那么在这里讲一下优化后的算法,首先上次分析得来的我们只要找的N的因数5就好了,那么有几
个呢,观察可以发现最多有K个,那么我们不妨控制答案范围在[1,nk]区间中,那么此时就可以结合二分
查找的思想快速找到答案
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sr = new Scanner(System.in);
long K = sr.nextLong();//输入数据
//从小到大递推过来 以5为单位递增
int ans =0;//用ans记录能贡献几个5
for(long i=5;;i+=5){
ans+=check(i);//判断i能贡献多少个5
if(ans>K){
System.out.print(-1);
return;
}else if(ans==K){
System.out.print(i);
return;
}
}
}
private static int check(long x) {
// TODO Auto-generated method stub
int k =0;
for(int i=5;;i*=5){
if(x%i==0){
k++;
}else{
break;
}
}
return k;
}
}
试题 F: 最大子矩阵时间限制: 1.0 s 内存限制: 512.0 MB 本题总分:15 分
【问题描述】
小明有一个大小为 N × M的矩阵,可以理解为一个 N行 M 列的二维数组。我们定义一个矩阵 m的稳定度 f ( m ) 为 f ( m ) = max ( m ) − min ( m ) ,其中 max ( m ) 表示矩阵 m中的最大值,min ( m ) 表示矩阵 m中的最小值。现在小明想要从这个矩阵中找到一个稳定度不大于 limit的子矩阵,同时他还希望这个子矩阵的面积越大越好(面积可以理解为矩阵中元素个数)。
子矩阵定义如下:从原矩阵中选择一组连续的行和一组连续的列,这些行列交点上的元素组成的矩阵即为一个子矩阵。
【输入格式】
第一行输入两个整数 N ,M表示矩阵的大小。
接下来 N行,每行输入 M个整数,表示这个矩阵。
最后一行输入一个整数 limit,表示限制。
【输出格式】
输出一个整数,分别表示小明选择的子矩阵的最大面积。
【样例输入】
3 4
2 0 7 9
0 6 9 3
8 3 6 4
8
【样例输出】
6
【样例说明】
满足稳定度不大于 8 的且面积最大的子矩阵总共有三个,他们的面积都是 6 (粗体表示子矩阵元素):2 0 7 9
0 6 9 7
8 4 6 42 0 7 9
0 6 9 7
8 4 6 42 0 7 9
0 6 9 7
8 4 6 4【评测用例规模与约定】
对于所有评测用例,0≤ 矩阵元素值,limit ≤ 10^5
.......等我有时间了再更新,这题我是用暴力做的,只有35分
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)