2020蓝桥杯模拟赛(java)

第一题 单位变换
题目

【问题描述】
在计算机存储中,15.125GB是多少MB?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
————————————————————————————————————————————————
答案:15488

public class Main{
	
	public static void main(String[] args) {
		System.out.println(15.125 * 1024);
	}
}

第二题 约数个数
题目

【问题描述】
1200000有多少个约数(只计算正约数)。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
————————————————————————————————————————————————
答案:96

public class Main{
	static int ans;
	static int a = 1200000;
	
	public static void main(String[] args) {
		int i = 1;
		while(i <= a) {
			if(a % i == 0) {
				ans++;
				i++;
			}else {
				i++;
			}
		}
		System.out.println(ans);
	}
}

第三题 叶结点数
题目

【问题描述】
一棵包含有2019个结点的二叉树,最多包含多少个叶结点?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
————————————————————————————————————————————————
这道题考的是二叉树中节点度的关系
n:总节点数
ni:度为 i 的节点
则 n = n0 + n1 + n2,
其中 n0 = n2 + 1
则 n = 2n0 - 1 + n1,
也就是 n0 = (n + 1 - n1) / 2
为了让叶子节点 n0 最大,可以使 n1 = 0,此时的二叉树就是完全二叉树
所以,n0 = (2019 + 1) / 2 = 1010

ps:节点度的关系都忘干净了=.=

第四题 数字9
题目

【问题描述】
在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算时只是算一个数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
————————————————————————————————————————————————————
答案:544

public class Main{
	
	public static void main(String[] args) {
		int ans = 0;
		for(int i = 1;i <= 2019;i++) {
			if(check(i)) ans++;
		}
		System.out.println(ans);
	}

	private static boolean check(int i) {
		while(i > 0) {
			int low = i % 10;//取最低位
			if(low == 9) return true;
			i /= 10;
		}
		return false;
	}
}

第五题 数位递增的数
题目

【问题描述】
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
30
【样例输出】
26
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n <= 1000。
对于 80% 的评测用例,1 <= n <= 100000。
对于所有评测用例,1 <= n <= 1000000。
————————————————————————————————————————————————

import java.util.Scanner;

public class Main{
	static int ans;
	static int n; 
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		sc.close();
		
		for(int i = 1;i <= n;i++) {
			if(check(i)) ans++;
		}
		System.out.println(ans);
	}

	private static boolean check(int x) {
		String s = String.valueOf(x);
		int len = s.length();
		for(int i = 0;i < len - 1;i++) {
			char high = s.charAt(i);//可以直接用字符比大小
			char low = s.charAt(i + 1);
			if(high > low) return false; 
		}
		return true;
	}
}

第六题 递增三元组
题目

【问题描述】
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
5
1 2 5 3 5
【样例输出】
2
【样例说明】
a[2] 和 a[4] 可能是三元组的中心。
【评测用例规模与约定】
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。
——————————————————————————————————————————————
数据规模 n 最大是1000,所以三指针枚举所有三元组的算法会超时

import java.util.Scanner;

public class Main{
	static int ans;
	static int n; 
	static int[] a;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		a = new int[n + 1];
		for(int i = 1;i <= n;i++) a[i] = sc.nextInt();
		sc.close();
		
		for(int j = 2;j <= n - 1;j++) {//枚举中心元素 a[j]
			//以a[j]为中心向两边寻找
			boolean left = false;//左边是否有比a[j]小的
			for(int i = j - 1;i >= 1;i--) {
				if(a[i] < a[j]) {
					left = true;
					break;
				}
			}
			boolean right = false;//右边是否有比a[j]大的
			for(int k = j + 1;k <= n;k++) {
				if(a[j] < a[k]) {
					right = true;
					break;
				}
			}
			if(left && right) ans++;
		}
		System.out.println(ans);
	}
}

第七题 音节判断
题目

【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。
————————————————————————————————————————————————
考点:正则表达式
常用知识点:
+:
一次或多次匹配前面的字符或子表达式。例如,“zo+” 与 “zo” 和 “zoo” 匹配,但与 “z” 不匹配。
*:
零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。
[xyz] :
字符集。匹配包含的任一字符。例如,"[abc]“匹配"plain"中的"a”。
[^xyz]:
反向字符集。匹配未包含的任何字符。例如,"[^abc]“匹配"plain"中"p”,“l”,“i”,“n”。

因为默认贪婪匹配,所以会匹配完整个单词。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main{
	static String word; 
	static boolean[] res = new boolean[4];
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		word = sc.next();
		sc.close();
		
		// 创建 Pattern 对象
		Pattern p = Pattern.compile("[^aeiou]+[aeiou]+[^aeiou]+[aeiou]+");//传入模式串
		// 现在创建 matcher 对象
	    Matcher m = p.matcher(word);//传入字符串
	    boolean success = m.matches();//返回匹配结果
	    if(success) {
	    	System.out.println("yes");
	    }else {
	    	System.out.println("no");
	    }
	}
}

第八题 长草
题目

【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
【样例输入】
4 5
.g…

…g…

2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。
——————————————————————————————————————————————
思路:读入初始空地的时候,将有草的土地构造成对象加入队列,对象中含有该草地的坐标和长出草的时间(第几个月长出来的)。数据读取完之后,开始典型的BFS,每次出队,将出队草地相连的土地种上草,month+1,入队,用一个 vis 二维数组记录哪些草地是有草的,最后遍历 vis 数组,将最终的土地面貌输出。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;

public class Main{
	static int N;
	static int M;
	static int K;
	static int[][] vis = new int[1010][1010];//有草的坐标标记为1
	static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, 1, 0, -1};
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
		N = s.charAt(0) - '0';
		M = s.charAt(2) - '0';
		LinkedList<Block> q = new LinkedList<Block>();
		for(int i = 0;i < N;i++) {
			String line = br.readLine();
			for(int j = 0;j < M;j++) {
				char c = line.charAt(j);
				if(c == 'g') {
					q.add(new Block(i, j, 0));//将最初的草地加入队列
					vis[i][j] = 1;
				}
			}
		}
		K = Integer.parseInt(br.readLine());
		
		while(!q.isEmpty()) {
			Block b = q.poll();
			int month = b.month;
			if(month < K) {
				for(int i = 0;i < 4;i++) {
					int nx = b.i + dx[i];
					int ny = b.j + dy[i];
					if(0 <= nx && nx < N && 0 <= ny && ny < M && vis[nx][ny] == 0) {
						vis[nx][ny] = 1;
						q.add(new Block(nx, ny, month + 1));
					}
				}
			}
		}
		//输出草地
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		for(int i = 0;i < N;i++) {
			for(int j = 0;j < M;j++) {
				if(vis[i][j] == 1) {
					bw.write('g');
				}else {
					bw.write('.');
				}
			}
			bw.newLine();
		}
		bw.flush();
	}
}
class Block {
    int i;
    int j;
    int month;

    public Block(int i, int j, int month) {
        this.i = i;
        this.j = j;
        this.month = month;
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值