第一题 单位变换
题目
【问题描述】
在计算机存储中,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;
}
}