星期计算
问题描述
已知今天是星期六,请问 2 0 22 20^{22} 2022天后是星期几?
注意用数字1到7表示星期一到星期日
思路:
- 每个星期都是由7天循环一次
- 所以只要是对经过多少天进行对7取余就可以得到结果
- 当前日期再判断一下
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger bigInteger=new BigInteger("20");
BigInteger bigInteger1=bigInteger.pow(22);
BigInteger x=bigInteger1.remainder(new BigInteger("7"));
BigInteger y=x.add(new BigInteger("6"));
System.out.println(y);
}
答案:
7
山
问题描述
这天小明正在学数数
他突然发现有些正整数的形状像一座“山”,比如123565321
、145541
,它们左右对称(回文)且数位上的数字先单调不减,后单调不增
小明数了很久也没有数完,他想让你告诉他在区间[2022, 2022222022]
中有多少个数的形状像一座“山”
思路:
- 用计数器来储存个数
- 分开看,回文和单调性分开判断
- 由于回文则只需判断一边的单调性
- 如果都正确计数则加1
public class Main {
public static void main(String[] args) {
int num = 0;
for (int i = 2022; i <= 2022222022; i++) {
if (isPalindrome(i)&&isMonotonicity(i)) {
num++;
}
}
System.out.println(num);
}
// 判断是否回文
public static boolean isPalindrome(int n) {
char[] chars = String.valueOf(n).toCharArray();
for (int i = 0; i < chars.length / 2; i++) {
if (chars[i] != chars[chars.length - i - 1]) {
return false;
}
}
return true;
}
//判断是否单调
public static boolean isMonotonicity(int n){
char[] chars = String.valueOf(n).toCharArray();
// 取中位数的长度
for (int i = 1; i < chars.length / 2 + (chars.length % 2); i++) {
if (chars[i] < chars[i-1]) {
return false;
}
}
return true;
}
}
可能是方法太笨了,需要很长时间才运行出来,还以为eclipse出了问题
答案
3138
字符统计
问题描述
给定一个只包含大写字母的字符串S
,请你输出其中出现次数最多的字母
如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母
输入格式
一个只包含大写字母的字符串S
输出格式
若干个大写字母,代表答案
思路:
- 用一个数组统计输入的字符串每个字符的次数
- 遍历一遍找出最大次数
- 遍历一遍输出次数与最大次数相同的字符
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int[] count = new int[26];
for (int i = 0; i < str.length(); i++){
// 统计输入的字符串每个字符的次数
count[str.charAt(i) -'A']++;
}
// 最大次数
int max = 0;
for (int i = 0; i < count.length; i++) {
if (count[i] > max) {
max = count[i];
}
}
for (int i = 0; i < count.length; i++) {
// 输出次数与最大次数相同的字符
if (count[i] == max) {
System.out.print((char) (i + 'A'));
}
}
}
}
最少刷题数
问题描述
小蓝老师教的编程课有N
名学生,编号依次是1 . . . N
第i
号学生这学期刷题的数量是Ai
对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题比他多的学生数不超过刷题比他少的学生数
输入格式
第一行包含一个正整数 N
第二行包含N
个整数:A1, A2, A3, . . . , AN
输出格式
输出N
个整数,依次表示第1 . . . N
号学生分别至少还要再刷多少道题
思路:
- 输入的刷题数进行排序
- 进行分情况考虑
- 奇数情况下,超过中间值才能满足全班刷题比他多的学生数不超过刷题比他少的学生数
- 偶数情况下需要等于中间偏大的值就可以满足条件
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] nums = new int[n];
int[] count = new int[n];
for (int i = 0; i < nums.length; i++) {
// 输入的一个数组,并把这个数组复制下来
nums[i] = scan.nextInt();
count[i] = nums[i];
}
// 个数组排一下序方便找到较中间的那个数
Arrays.sort(count);
// 找到中间的索引
int index = 0;
// 分情况讨论值
if (n % 2 == 0) {
index = n / 2 + 1;
} else {
index = n / 2;
}
// 找到中间值
int middle = count[index];
for (int i = 0; i < n; i++) {
// 判断得到最终结果
if (nums[i] < middle) {
System.out.print(middle - nums[i] + 1);
System.out.print(" ");
} else {
System.out.print(0);
System.out.print(" ");
}
}
scan.close();
}
}
求阶乘
问题描述
满足N!
的末尾恰好有K
个0
的最小的N
是多少?
如果这样的N
不存在输出−1
输入格式
一个整数 K
输出格式
一个整数代表答案
思路
- 只有2*5两个质因数可以组合10,2的数量大于5的数量
1 5 2 10 3 15 4 20 5 -1
6 25 7 30 8 35 9 40 10 45 11 -1
......
- 所以6个进行一次循环,对k%6获取无效的值的次数
- k的值为无效的值的次数和5的倍数之和
- (k-5)%6==0则直接返回-1
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String k = sc.next();
// 得到k的实际值
BigInteger bigK = new BigInteger(k);
// k%6获取无效的值的次数
BigInteger n = bigK.divide(BigInteger.valueOf(6L));
// (k-5)%6==0则直接返回-1
if (bigK.subtract(BigInteger.valueOf(5L)).remainder(BigInteger.valueOf(6L)).toString().equals("0")) {
System.out.println(-1);
} else {
// k的值为无效的值的次数和5的倍数之和,得到最终的值
System.out.println(bigK.subtract(n).multiply(BigInteger.valueOf(5L)));
}
}
}
最大子矩阵
问题描述
小明有一个大小为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
,表示限制
输出格式
输出一个整数,分别表示小明选择的子矩阵的最大面积
数组切分
问题描述
已知一个长度为N
的数组A1, A2, A3, ...AN
恰好是1 ∼ N
的一个排列。现在要求你将A
数组切分成若干个 (最少一个,最多N
个) 连续的子数组,并且每个子数组中包含的整数恰好可以组成一段连续的自然数
输入格式
第一行包含一个整数N
。第二行包含N
个整数,代表A
数组
输出格式
输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007
取模后的值
回忆迷宫
问题描述
爱丽丝刚从一处地下迷宫中探险归来,你能根据她对于自己行动路径的回忆,帮她画出迷宫地图吗?
迷宫地图是基于二维网格的。爱丽丝会告诉你一系列她在迷宫中的移动步骤,每个移动步骤可能是上下左右四个方向中的一种,表示爱丽丝往这个方向走了一格。你需要根据这些移动步骤给出一个迷宫地图,并满足以下条件:
1、爱丽丝能在迷宫内的某个空地开始,顺利的走完她回忆的所有移动步骤。
2、迷宫内不存在爱丽丝没有走过的空地。
3、迷宫是封闭的,即可通过墙分隔迷宫内与迷宫外。任意方向的无穷远处视为迷宫外,所有不与迷宫外联通的空地都视为是迷宫内。(迷宫地图为四联通,即只有上下左右视为联通)
4、在满足前面三点的前提下,迷宫的墙的数量要尽可能少。
输入格式
第一行一个正整数 N,表示爱丽丝回忆的步骤数量接下来一行 N 个英文字符,仅包含 UDLR 四种字符,分别表示上(Up)、下(Down)、左(Left)、右(Right)
输出格式
请通过字符画的形式输出迷宫地图。迷宫地图可能包含许多行,用字符 ‘’表示墙,用 ‘ ’(空格)表示非墙。
你的输出需要保证以下条件:
1、至少有一行第一个字符为 ‘’
2、第一行至少有一个字符为 ‘’
3、每一行的最后一个字符为 ‘’
4、最后一行至少有一个字符为 ‘*’
红绿灯
问题描述
爱丽丝要开车去上班,上班的路上有许多红绿灯,这让爱丽丝很难过。为
了上班不迟到,她给自己的车安装了氮气喷射装置。现在她想知道自己上班最
短需要多少时间。
爱丽丝的车最高速度是 1V
米每秒,并且经过改装后,可以瞬间加速到小于
等于最高速的任意速度,也可以瞬间停止。
爱丽丝家离公司有N
米远,路上有M
个红绿灯,第i个红绿灯位于离爱
丽丝家Ai
米远的位置,绿灯持续Bi
秒,红灯持续C
秒。在初始时(爱丽丝开始计时的瞬间),所有红绿灯都恰好从红灯变为绿灯。如果爱丽丝在绿灯变红的瞬间到达红绿灯,她会停下车等红灯,因为她是遵纪守法的好市民。氮气喷射装置可以让爱丽丝的车瞬间加速到超光速(且不受相对论效应的
影响!),达到瞬移的效果,但是爱丽丝是遵纪守法的好市民,在每个红绿灯前她都会停下氮气喷射,即使是绿灯,因为红绿灯处有斑马线,而使用氮气喷射装置通过斑马线是违法的。此外,氮气喷射装置不能连续启动,需要一定时间
的冷却,表现为通过K
个红绿灯后才能再次使用。(也就是说,如果 K = 1
,就能一直使用啦!)初始时,氮气喷射装置处于可用状态
输入格式
第一行四个正整数N、M、K、V
,含义如题面所述。
接下来M
行,每行三个正整数Ai、Bi、Ci
,含义如题面所述
输出格式
输出一个正整数 T,表示爱丽丝到达公司最短需要多少秒