微众银行 8-27 笔试全A JAVA
题目连接:
1.使用工具类进行循环计数
import java.util.Calendar;
import java.util.Scanner;
/*
大哥在直播的时候经常被粉丝刁难。
今天粉丝们在弹幕上问他的问题是:从公元a年1月到公元b年12月有多少个月份满足该月的第一天是星期一。
大哥不会数数,所以装作掉线后找到了你来帮他答题,请你以最快的速度帮帮他。
输入描述 两个正整数满足1900<=a<=b<=2100
输出描述 输出公元a年1月到公元b年12月有多少个月份满足该月的第一天是星期一。
样例输入 2021 2021 样例输出 3 提示 2021年1月1日是星期五。2021年的二月,三月和十一月都满足条件。
100%
*/
/**
* @author poiuy
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
int res = 0;
for (int i = a; i <= b; i++) {
res += help(i);
}
System.out.println(res);
}
public static int help(int year) {
int res = 0;
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
for (int i = 0; i < 12; i++) {
calendar.set(Calendar.MONTH, i);
calendar.set(Calendar.DAY_OF_MONTH, 1);
int day = calendar.get(Calendar.DAY_OF_WEEK);
if (day == 2) {
res++;
}
}
return res;
}
}
2. 1. 使用Deque记录所有结果,卡27%
2. 只记录每个节点的最大值和最小值,90%
3. 使用long 100%
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;
/*
第 i 行有 i 个数,位置居中对齐。
显然,除了最后一行的点,每个点的下方都有两个点与它相邻,本题并不是关于三角形数的问题,而是与这个性质有关。
给你若干个点,按照上图中的方式排列(保证排满,即点的个数是三角形数)。
你一开始位于第一行的点,身上带有一个数 1。
然后你要一行一行地往下走,每一步可以走到下方两个相邻点中的一个,走 n-1 步可到达终点(底部)。
除了第一行的点以外,每个点上带有一个效果,它可能是如下几种中的一种:
+ x:使你身上的数加 x
- x:使你身上的数减 x
/ x:使你身上的数除以 x,向远离0的方向取整,正数向上,负数向下
s:如果的身上的数为正数,则开平方根,向上取整。如果为负数,则取相反数,进行如上操作,再取相反数,如 8 经过 s 操作为 3,-8 则变为 -3。
n:使你身上的数变为它的相反数,即乘 -1 显然,从起点到一个点的路径并不一定是唯一的,到这个点时身上的值也不一定唯一。你的任务是计算以最后一行的每个点为终点时,可能的最大值和最小值
输入描述 第一行一个正数 n,表示三角形的层数。(n <= 400) 后面 n*(n+1)-1 行,每行有 “+ x” “- x” “/ x” “s” “n” 中的一种,运算符和数之间有一个空格,作用详见问题描述,按从上到下,从左到右的顺序表示除第一行以外的各点上的效果。(0 < x <= 1000000000)
输出描述 两行,每行 n 个整数,用空格隔开。
第一行依次表示最后一行从左到右各点作为终点时的最大值。
第二行依次表示最后一行从左到右各点作为终点时的最小值。
样例输入 3 + 2 n / 2 - 5 s 样例输出 2 -2 -1 2 -6 -1
100%
*/
/**
* @author poiuy
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
PrintWriter out = new PrintWriter(System.out);
int n = Integer.parseInt(in.nextLine());
if (n == 0) {
System.out.println();
System.out.println();
return;
}
long[] resMax = new long[]{1};
long[] resMin = new long[]{1};
for (int i = 1; i < n; i++) {
long[] resMax1 = new long[i + 1];
long[] resMin1 = new long[i + 1];
Arrays.fill(resMax1, Long.MIN_VALUE);
Arrays.fill(resMin1, Long.MAX_VALUE);
String[] strs = new String[i + 1];
strs[0] = in.nextLine();
for (int j = 1; j <= i; j++) {
strs[j] = in.nextLine();
long num1 = help(resMax[j - 1], strs[j - 1]);
long num2 = help(resMin[j - 1], strs[j - 1]);
resMax1[j - 1] = Math.max(Math.max(resMax1[j - 1], num1), num2);
resMin1[j - 1] = Math.min(Math.min(resMin1[j - 1], num1), num2);
num1 = help(resMax[j - 1], strs[j]);
num2 = help(resMin[j - 1], strs[j]);
resMax1[j] = Math.max(Math.max(resMax1[j], num1), num2);
resMin1[j] = Math.min(Math.min(resMin1[j], num1), num2);
}
resMax = resMax1;
resMin = resMin1;
}
for (int i = 0; i < resMax.length; i++) {
if (i == resMax.length - 1) {
out.println(resMax[i]);
} else {
out.print(resMax[i] + " ");
}
}
for (int i = 0; i < resMin.length; i++) {
if (i == resMin.length - 1) {
out.println(resMin[i]);
} else {
out.print(resMin[i] + " ");
}
}
out.flush();
out.close();
}
public static long help(long num, String str) {
if (str.equals("s")) {
if (num < 0) {
return (long) Math.ceil(Math.sqrt(num * -1)) * -1;
} else {
return (long) Math.ceil(Math.sqrt(num));
}
} else if (str.equals("n")) {
return num * -1;
} else {
String[] strs = str.split("\\s");
if (strs[0].equals("+")) {
return num + Integer.parseInt(strs[1]);
} else if (strs[0].equals("-")) {
return num - Integer.parseInt(strs[1]);
} else {
if (num < 0) {
return (long) Math.floor(num / (Integer.parseInt(strs[1]) * 1.0));
} else {
return (long) Math.ceil(num / (Integer.parseInt(strs[1]) * 1.0));
}
}
}
}
}
3. 排序数据,遍历即可 import java.util.Arrays;
import java.util.Scanner;
/*
6
1 3 3 3 4 4
100%
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = in.nextInt();
}
Arrays.sort(nums);
int idx = 0;
int need = 1;
while(idx < n) {
if (nums[idx] >= need) {
idx++;
need++;
}
else {
idx++;
}
}
System.out.println(need);
}
}