蓝桥杯 Java 省赛 B 组(初赛)填空题

欢迎各位小伙伴关注,本系列持续更新中🏃

大家好 我是寸铁💪

蓝桥杯填空题不会做❓

🌟 没关系 跟着我一起来探索👏

往期回顾:

Java快读快写

java常用数组拷贝

常用Java竞赛基础技能总结

沙场练兵🎯

星期计数 ✨

刚开始看到这道题不知怎么做好?
那不知道怎么做怎么办?
看了一些网上的博客直接列出代码
实际上不利于初学者!
不会做没关系,我带你做,虽然我也很菜 🎶
不过竞赛竞赛,粤菜粤爱打,我们心态要乐观积极。
心态和实力你总得占一个吧

希望大家都是既有实力又是Lucky的那颗星星 🌟

万物始于枚举!!!

题目问我们20的22次方后是星期几?
我们开始枚举:
今天是星期六,星期六1天后为星期七(星期日,不过是换一种说法)。
2天后为星期1
3天后为星期2
4天后为星期3
结合一星期7天,我们可以得出规律:
1天的暂时不考虑
先看2天以上的
2天后为星期1:6+2%7=1
3天后为星期2:6+3%7=2
4天后为星期3:6+4%7=3
看到这里聪明的小伙伴发现
6+n天后%7=对应的星期几
1天的怎么看?直接加即可!
因为星期7是在一周的范围内。所以是合法的。
有小伙伴会问万一算到最后得出的是8、9、10等等天数怎么办?
那就再对7取模,为什么?
星期8是不是就是星期七(天)的后一天即星期一即8%7=1
星期9是不是就是星期七(天)的后两天即星期二即9%7=2
星期10是不是就是星期七(天)的后一天即星期一即10%7=3

这样处理最后答案一定是合法正确的!!!

考虑到周六一天后直接加1的情况
代码可以这样写:6+(20^22)%7
在一周七天的合法范围内,最后答案为7

可能有小伙伴会这样问:可以这样写(6+20^22)%7=7?
如果得出的数是大于7说明他里面还有一周需要再取模!
像得到8、9、10等等,我们直接对7取模即可。
8%71、9%72、10%7==3又将答案返回到合法区间内且答案正确(上述验证)

可以!

不过你需要判断一下这里是加上6再取模得到的结果
如果最终会得到0的话,是因为(6+1)%7=0
0的话也没关系,说明在星期一的前一天即星期7,答案正确!

这样是不是就成功拿下5分了,恭喜你离省一又近了一步 ✌️

写法1

import java.util.*;
public class Main{
	public static void main(String []args) {
		Scanner sc=new Scanner(System.in);
		int res=(int) Math.pow(20,22);
		System.out.println(6+res%7);
	}
}

写法2(循环求20^22,会溢出需要先取模)

import java.util.*;
public class Main{
	public static void main(String []args) {
		Scanner sc=new Scanner(System.in);
		int res=1;
		for(int i=1;i<=22;i++) {
			res=(res*20)%7;
		}
		System.out.println(6+res);
	}
}

11届-门牌制作✨

试题 A: 门牌制作
本题总分:5 分
【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个
字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

Accode

import java.util.*;
public class Main{
	public static int  get(int x) {
		int ans=0;
		while(x>0) {
			int t=x%10;
			x/=10;
			if(t==2)ans++;
		}
		return ans;
	}
	public static void main(String []args) {
		Scanner sc=new Scanner(System.in);
		int res=0;
		for(int i=1;i<=2020;i++) {
			res+=get(i);
		}
		System.out.println(res);
	}
}

12届-ASC✨

已知大写字母 A 的 ASCII 码为 65,请问大写字母 L 的 ASCII 码是多少?

直接输出转换即可。

import java.util.*;
public class Main{
	public static void main(String []args) {
		Scanner in=new Scanner(System.in);
		System.out.println((int)'L');
	}
}

12届-卡片✨

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。
小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?

//3180
//3181
import java.util.*;
public class Main{
	static int cnt[]=new int[10];
	public static boolean check(int x) {
		while(x>0) {
			int t=x%10;
			x/=10;
			cnt[t]--;
			if(cnt[t]<0)return false;
			//这里如果取cnt[t]<=0,输出3180。
			//走到3181时侯,3隔壁的1此时会被统计进去cnt[1]=0
			//但是它是可以被构造的,cnt[1]=0表示此时的数刚好用完
			//下一次再想用的时候就用不到了,所以需要<0,用于下一次的判断
			}
		return true;
	}
	public static void main(String []args) {
		Scanner sc=new Scanner(System.in);
	    for(int i=0;i<10;i++)cnt[i]=2021;
		for(int i=1;;i++) {
			if(!check(i)) {
		//如果说当前的i是拼不出来的,最多只能拼到前一个数。
			System.out.println(i-1);
			return;
		}
		}
	}
}

题目描述

试题 B: 山
本题总分:5 分

【问题描述】

这天小明正在学数数。

他突然发现有些正整数的形状像一座“山”,比如 123565321、145541,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。

小明数了很久也没有数完,他想让你告诉他在区间 [2022, 2022222022] 中有多少个数的形状像一座“山”。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

分析

又是经典的回文串问题!
看到题目的回文串需要满足两个要求:

(1)左右对称(回文)

(2)数字先单调不减,后单调不增

如:123565321、145541
我们不妨从题目给出的样例出发:
123565321是以6作为分界线的情况
145541是没有分界线的情况

无论是哪种情况,我们在枚举的时候只需要枚举前一半数字即可。
为什么?
回文串的性质:左右对称
即后一半数字为前一半数字反过来
如:123565321只需枚举1235再去验证后面的数字是否是5321即可
145541只需枚举145再去验证后面的数字是否是541即可
这样我们先满足第一个回文条件。

接下来,需要去判断是否先单调不减,后单调不增
同样的这里我们只需判断前一半数字是否满足单调不减即可
如果他是回文串,前一半数字单调不减后一半数字必定是单调不增!
为什么?
因为前一半数字确保严格单调不减,后面的回文数字是将前一半反过来是单调不增
以123565321为例:
123565321是回文串
1235单调不减反过来5321刚好是单调不增
以145541为例:
145541是回文串
145单调不减反过来541是单调不增

也就是说:
他是回文串并且前一半数字严格满足单调不减这一条件
那么后一半数字必定满足单调不增!

因此,直接求不好求,可以间接求!
只要这个数不满足单调不减这个条件或者左右对称这两个条件其中之一
我们就可以直接返回false,剩下的便是满足回文串的答案
理清思路后,我们就可以写代码了~

Accode

import java.util.*;
public class Main{
	public static void main(String []args) {
		Scanner sc=new Scanner(System.in);
		int cnt=0;
		for(long i=2022;i<=2022222022;i++) {
			if(check(i))cnt++;
		}
		System.out.print(cnt);
	}
	public static boolean check(long n) {
		String s=String.valueOf(n);//创建字符串
		char a[]=s.toCharArray();
		for(int i=0;i<a.length/2;i++) {
			if(a[i]>a[i+1]||a[i]!=a[a.length-i-1]) {
			//判断是否是左右对称
				return false;
			}
		}
		return true;
	}
}

有同学会问可不可以这么写?

public static boolean check(long n) {
		String s=String.valueOf(n);
		char a[]=s.toCharArray();
		for(int i=0;i<a.length/2;i++) {
			if(a[i]<=a[i+1]&&a[i]==a[a.length-i-1]) {
				return true;
			}
		}
		return false;
	}

a[i]<=a[i+1]&&a[i]==a[a.length-i-1]
这句话是对数字扫一遍找到有满足的条件便留下来:
条件可以不同步
如2110
1<=1 && 1反过来等于1 满足这一语句

因此他被留下来,但是实际上是错的!!!

2110怎么可能会是我们要的答案!

因此,我们应该用筛选式的写法筛出满足条件的数字即可
检验一下是不是满足其中之一的条件,不满足其中之一则直接返回false
其他的答案便是正确的答案。

Tips

像上面这种写法我们一定要在程序中打印一下输出回文数内容,检验一下对不对!
细心细心再细心❗️ ❗️ ❗️

参考资源

参考

☀️☀️☀️☀️☀️☀️
后续有补充,持续更新中🌋
喜欢的伙伴点点赞,关个注💗

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寸 铁

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值