第十三届蓝桥杯省赛Java B组 ABCDE

本文提供了多个编程题目,包括星期计算、寻找特定形状的数字、字符频率统计、最少刷题数和求阶乘的问题。每个问题都有详细的问题描述和题解代码,主要涉及算法和数据处理。解答涉及Java编程语言,通过示例代码展示了解题思路和方法。
摘要由CSDN通过智能技术生成

目录

一、选择题

A:星期计算

问题描述

题解代码

B:山

问题描述

题解代码

二、编程题

C:字符统计

问题描述

题解代码

D:最少刷题数

问题描述

题解代码

E:求阶乘

问题描述

题解代码


一、选择题

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.

第一次尝试写题解,若有什么错误,欢迎各位大佬评论区指点交流。     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值