目录
GitHub算法详细代码(多届比赛的多个算法题):yhbn/algorithm (github.com)
懒得打字了,题目直接上图片了,就会前五个,
个人主观感觉这五个加起来也没前几天发布的十四届的那两个题目难
第十四届蓝桥杯JavaB组E题----蜗牛_蓝桥杯蜗牛-优快云博客
A:星期计算
简单题,用Java自带的BigDecim可以直接算,也可以直接用计算器自己算也行,对7取%即可
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger bigInteger = BigInteger.valueOf(20).pow(22).mod(BigInteger.valueOf(7));
int result = (6 + bigInteger.intValue()) % 7;
System.out.println(result == 0 ? 7 : result);
}
}
B:山
经典的回文数的问题,之前刷洛谷的时候做过,用Java""+数字得到字符串的性质,然后用字符串的reserve方法逆转字符串,与原字符串比较,然后在把字符串转成字符数组,从1开始一直到chars.length/2 比较与前一个数字的大小
package No13_2022;
import org.junit.Test;
/*
这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如 123565321 、 145541 ,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间[2022,202222 2022]中有多少个数的形状像一座“山”。
*/
public class test2 {
@Test
public void test(){
int sum=0;
for (int i = 2022; i <2022222022 ; i++) {
int temp=i;
int j=0;
int B[]=new int[10];
while (temp!=0){
B[j]=temp%10;
temp=temp/10;
j++;
}
int v=0;
int low=0;
int high=9;
while (B[high]==0){
high--;
}
while (low<high){
if (B[low]!=B[high]){
v=1;
}
if (B[low]==B[high]){
if (low>0){
if (B[low]<B[low-1]){
v=1;
}
}
}
}
if (v==0){
sum++;
}
}
System.out.println(sum);
}
}
C:字符统计
也是一道经典的题,之前做过一个线性表(顺序表,链表都可以),要保证26个字母一个最多出现一次,要怎么解决?这两个题目的相似之处就是"26个字母"构成的,而不是其他的无穷个元素(比如汉字)构成的,直接桶排序,创建数组桶用来计数,最后便利数组,把找到的最大的下标加上65转为char输出即可
package No13_2022;
import org.junit.Test;
public class test3 {
void lost(String S){
Byte a='A';
byte[] sb = S.getBytes();
Byte b[]=new Byte[26];
for (int i = 0; i < 26; i++) {
b[i]=0;
}
for (int i = 0; i < sb.length; i++) {
b[sb[i]-65]++;
}
int max=0;
for (int i = 0; i < 26; i++) {
if (b[i]>max) max=b[i];
}
for (int i = 0; i < 26; i++) {
if (b[i]==max) {
char p= (char) (i+'A');
System.out.print(p);
}
}
}
@Test
public void test(){
lost("BABBACAC");
}
}
D:最少刷题数
为什么这道题会出现在这,这也是简单题,利用Arrays.sort给数组排序,找到中点(顺序表可随机访问,找重点时候不用遍历)创建新数组c把中点值和原数组比较,原数组第i个元素大于等于中点值时,c[i]等于0,否则c[i]=mid-a[i]+1
package No13_2022;
import java.util.Arrays;
import java.util.Scanner;
public class test4 {
void shauti(){
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int a[]=new int [N];
int b[]=new int[N];
for (int i = 0; i < N; i++) {
int temp=scanner.nextInt();
a[i]=temp;
b[i]=temp;
}
Arrays.sort(a);
int mid=a[N/2];
//System.out.println(mid);
int c[]=new int[N];
for (int i = 0; i < N; i++) {
if (b[i]>=mid)c[i]=0;
else c[i] =mid-b[i]+1;
}
for (int i = 0; i < N; i++) {
System.out.print(c[i]);
}
}
}
E:求阶乘
先new一个k个0的字符串v,然后写一个求阶乘后K位的函数(注意要保证阶乘值的位数要大于k,把后k位以字符串的形式返回)然后 用v.equals(阶乘函数返回的字符串即可)
package No13_2022;
import java.util.Scanner;
public class test5 {
//TODO 满足N!的末尾恰好有K个 0 的最小的N是多少?
//TODO 如果这样的N不存在输出-1
void number (){
Scanner scanner = new Scanner(System.in);
long k=scanner.nextLong();
String v="";
long i=0;
while (i<k){
v+="0";
i++;
}
i=1;
while (!v.equals(jiecheng(i,k))){
i++;
}
System.out.println(i);
}
String jiecheng(long a,long k){
long jie=1l;
while (a>0){
jie*=a;
a--;
}
char[] chars = ("" + jie).toCharArray();
String s="";
if (chars.length>=k){
for (int i = chars.length-1; i >chars.length-1-k ; i--) {
s+=chars[i];
}
}
return s;
}
}