第一届“Nukkit杯”Java编程公开竞赛(模拟卷I)答案与解析

单项选择题

1

选A。注意Java中的基本数据类型指的是intlongshortfloatdoublebooleanbytechar,不要和别的语言弄混了。

2

选D。所有的Set内包含的元素都不可以重复。

3

选C。这题简单。

4

选C。这题简单。

5

选C。注意ObjectClass::function形式的lambda表达式的参数数量和function函数的参数数量一致。

6

选A。注意B选项里是[1-9],和[0-9]是不一样的;C选项.*没有转义,D选项?不对,应该改为.?

7

选B。这题简单,换算一下就行了。

8

选A。注意N-S图的识别,中间x大于等于0的部分,相当于Java里的while语句。

9

选A。注意Instant存储的是时刻,不是时间间隔,存储时间间隔应该用Duration

10

选D。这题程序的功能是计算化学分子式的分子量,需要匹配化学元素的符号,可以是一个大写字母,也可以是一个大写加一个小写,后面省略数字表示一个原子,不省略表示相应数量的原子,A对。work函数的返回值为double类型,不是int类型,应该输出46.0,B对。在lambda表达式中,所有引用外部变量必须是final或等效final的,直接为double类型无法达到这个效果,不能满足lambda表达式的要求,C对。至于D项,你可以扔一个空字符串进去,或者程序里没有定义的元素进去。

如果不了解等效final的概念,可以看看这篇文章

多项选择题

11

选BD。这题模拟一下冒泡排序的方法就可以了,注意的是可以是大到小也可以是小到大。

12

选C。分析可得随机变量的值属于$[36,540]$ 。

13

选ABD。Doug Lea是并发编程的大神,java.util.concurrect包的很多类都是他参与编写的。C明显不对。

15

选CD。javap只被包含在jdk内,A错。PriorityQueue不能存储null,B错。剩下的都是对的,要仔细看。

如果不了解PriorityQueue,看这里

填空题

17

填$144$。

为了简化叙述,将空位数为$x$时移栽的方法记为$f(x)$。

先讨论$x$比较小的情况。$x=1$时,一个空位无论如何都不会有两朵花相邻,所以空位上可以有或者没有花,一共两种方案,所以$f(1)=2$。$x=2$时,两个空位每个空位都可以选择有或没有,但是两个空位都有的情况会出现两朵花相邻,那就不满足题意,所以$f(2)=2^2-1=3$。

$x \ge 3$时,我们可以把所有方法$f(x)$分为两种:最末尾的位置有花,或者最末尾的位置没有花。最末尾的位置有花的时候,倒数第二个位置必须没有花,那么对于第一个到倒数第三个位置,花的有无可以是任意的,这里的情况有$f(x-2)$种,对应第一个到倒数第三个位置的排列。最末尾位置没有花的时候,第一个到倒数第二个位置都是任意的,这里的情况同理有$f(x-1)$种。所以所有的方法就是这两个方法的和,或者用公式表达,$f(x)=f(x-1)+f(x-2)$。

获得这个公式后,我们把$f(1)$和$f(2)$的值放进去递推一下,可以得到$f(10)$的值为$144$,或者说空位数为$10$的时候,移栽的方法有$144$种。嗯,问题解决了。

18

第一空$6$,第二空$246$,第三空参考代码在下面:

1
2
3
4
Stream.iterate(1.0, i -> i + 1.0)
.map(n -> Math.pow(Math.sqrt(2.0) + 2.0, n)
- Math.pow(Math.sqrt(2.0) - 2.0, n))
.map(n -> n * 3.0 * Math.sqrt(2.0) / 8.0);

这题第一空好算,设方程推下去。第二空如果有耐心推的话也可以推出来,前提是不要推错。第三空相当于让你写通项公式,难度不低,如果写不出通项公式非常懵逼。下面讲一下一般的解法。

首先$n=1$时,$a_1=S_1$,$\frac{1}{2}S_1+\frac{3}{4}=a_1$,解得$a_1=\frac{3}{2}$。

$n\ge 2$时,数列$\left\{\frac{1}{2}S_n+\frac{3}{4}\right\}$的前$n$项和为$a_n$,那么有

$$
a_n-a_{n-1}=S_n+\frac{3}{4}
$$

要从这个等式得到数列的解析式,需要尝试把这个等式转化为等比数列。设变量$u$,利用变量$u$拆解$S_n$项,得到

$$
a_n-a_{n-1}=(\frac{1}{2}-u)S_n+uS_n+\frac{3}{4}
$$

对$uS_n$项进行拆项,整理得到

$$
a_n-a_{n-1}=(\frac{1}{2}-u)S_n+ua_n+uS_{n-1}+\frac{3}{4}
$$

$$
(1-u)a_n+(u-\frac{1}{2})S_n=a_{n-1}+uS_{n-1}+\frac{3}{4}
$$

$$
\frac{1-u}{u-\frac{1}{2}}=\frac{1}{u}
$$

解得$u^2=\frac{1}{2}$,不妨设$u=\frac{\sqrt{2}}{2}$,那么得到

$$
(1-\frac{\sqrt{2}}{2})a_n+(\frac{\sqrt{2}}{2}-\frac{1}{2})S_n=a_{n-1}+\frac{\sqrt{2}}{2}S_{n-1}+\frac{3}{4}
$$

整理得到

$$
a_n+\frac{\sqrt{2}}{2}S_n+\frac{3\sqrt{2}}{4}=(2+\sqrt{2})\left(a_{n-1}+\frac{\sqrt{2}}{2}S_{n-1}+\frac{3\sqrt{2}}{4}\right)
$$

所以$\left\{a_n+\frac{\sqrt{2}}{2}S_n+\frac{3\sqrt{2}}{4}\right\}$是公比为$2+\sqrt{2}$的等比数列。所以有:

$$
a_n+\frac{\sqrt{2}}{2}S_n+\frac{3\sqrt{2}}{4}=(2+\sqrt{2})^{n-1}\left(a_1+\frac{\sqrt{2}}{2}S_1+\frac{3\sqrt{2}}{4}\right)
$$

因为$a_1=S_1=\frac{3}{2}$,所以得到

$$
\begin{align}
a_n+\frac{\sqrt{2}}{2}S_n+\frac{3\sqrt{2}}{4}&=\frac{3+3\sqrt{2}}{2}×(2+\sqrt{2})^{n} \\
a_{n-1}+\frac{\sqrt{2}}{2}S_{n-1}+\frac{3\sqrt{2}}{4}&=\frac{3+3\sqrt{2}}{2}×(2+\sqrt{2})^{n-1}
\end{align}
$$

两式相减得到

$$
\frac{\sqrt{2}}{2}a_n+a_n-a_{n-1}=\frac{6+3\sqrt{2}}{4}×(2+\sqrt{2})^{n-1}
$$
所以

$$
\begin{aligned}
a_n=&\frac{3}{2}×(2+\sqrt{2})^{n-1}+(2-\sqrt{2})^{1}a_{n-1} \\
(2-\sqrt{2})^{1}a_{n-1}=&\frac{3}{2}×(2+\sqrt{2})^{n-2}(2-\sqrt{2})^{1}+(2-\sqrt{2})^{2}a_{n-2} \\
(2-\sqrt{2})^{2}a_{n-2}=&\frac{3}{2}×(2+\sqrt{2})^{n-3}(2-\sqrt{2})^{2}+(2-\sqrt{2})^{2}a_{n-3} \\
\cdots\\
(2-\sqrt{2})^{n-2}a_{1}=&\frac{3}{2}×(2+\sqrt{2})^{1}(2-\sqrt{2})^{n-2}+(2-\sqrt{2})^{n-1}a_{1} \\
\end{aligned}
$$
全部相加,消元,代入$a_1=\frac{3}{2}$得到
$$
a_n=\frac{3}{2}×\left((2+\sqrt{2})^{n-1}(2-\sqrt{2})^0+(2+\sqrt{2})^{n-2}(2-\sqrt{2})^1\\
+(2+\sqrt{2})^{n-3}(2-\sqrt{2})^{2}+\cdots+(2+\sqrt{2})^{0}(2-\sqrt{2})^{n-1}\right)
$$
两边同乘$\frac{2}{3(2+\sqrt{2})^{n-1}}$,得到
$$
\frac{2a_n}{3(2+\sqrt{2})^{n-1}}=\frac{(2-\sqrt{2})^0}{(2+\sqrt{2})^0}+\frac{(2-\sqrt{2})^1}{(2+\sqrt{2})^1}+\frac{(2-\sqrt{2})^2}{(2+\sqrt{2})^2}+\cdots+\frac{(2-\sqrt{2})^{n-1}}{(2+\sqrt{2})^{n-1}}
$$

$$
\frac{2a_n}{3(2+\sqrt{2})^{n-1}}=(3-2\sqrt{2})^0+(3-2\sqrt{2})^1+(3-2\sqrt{2})^2+\cdots+(3-2\sqrt{2})^{n-1}
$$

利用等比数列的公式得到
$$
\frac{2a_n}{3(2+\sqrt{2})^{n-1}}=\frac{1×\left(1-(3-2\sqrt{2})^{n}\right)}{2\sqrt{2}-2}
$$
化简得到
$$
\frac{2a_n}{3(2+\sqrt{2})^{n-1}}=\frac{1-(3-2\sqrt{2})^{n}}{2\sqrt{2}-2}
$$

$$
a_n=\frac{3}{2}×\frac{1-(3-2\sqrt{2})^{n}}{2\sqrt{2}-2}×(2+\sqrt{2})^{n-1}
$$

所以数列${a_n}$的通项公式是:
$$
a_n=\frac{3\sqrt{2}}{8}\left((2+\sqrt{2})^n-(2-\sqrt{2})^n\right)
$$
知道了通项公式,这个数列就很容易用Stream API来表示了。

自选问题

编程题