试题C——答案:4042
【问题描述】
有一棵二叉树,有2021个叶结点。
请问。这棵树至少有多少个结点?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
二叉树结点的求解
【答案】:4042
【解析】:
非空二叉树上的叶子结点数(度为0的节点,称为“叶子结点”)等于度为2的结点数加1,即n0=n2+1 。
设度为0、1、2的结点个数分别为n0、n1、n2,二叉树的节点总数n=n0+n1+n2 。
二叉树的总结点个数为:n=n0+n1+n2=n0+n1+(n0-1)
度为2的结点数 n2 = n0 - 1 = 2021 - 1 = 2020
叶子节点的数目为2021个(奇数),所以肯定存在度为1的节点,即 n1 = 1
所以,二叉树的总结点个数至少为:
n=n0+n1+n2=n0+n1+(n0-1)=2021+1+2020=4042
试题D——答案:25
问题描述
Fibonacci序列按照如下公式定义:
F[1] = 1
F[2] = 1
F[i] = F[i-1] + F[i-2] (i>2)
前几个 Fibonacci 数为 1, 1, 2, 3, 5, 8, 13, 21。
请问,前100个 Fibonacci 数中,有多少个数是 3 的倍数?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
找规律
多写几个找规律:1、1、2、3、5、8、13、21、34、55、89、144 …
会发现每4个数中,会出现一个3的倍数。所以,前100个数中,3的倍数有:100÷4=25个。
代码实现python
f=[1,1] //列表
for i in range(2,100):
f.append(f[i-1]+f[i-2])
ans=0
for i in range(100):
if f[i]%3==0:
ans+=1
print(ans)
代码实现java
遍历Fibonacci序列——Fibonacci序列的第100项数据,会爆“int型数组、long型数组”,所以要使用BigInteger数组。
import java.math.BigInteger;
public class Fibonacci {
public static void main(String[] args) {
// test1();
// test2();
test3();
}
public static void test1() { //测试:fib[100]爆int数组
int fib[] = new int[105];
fib[0] = 0;
fib[1] = fib[2] = 1;
for (int i = 3; i <= 102; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
int answer = 0;
for (int i = 1; i <= 100; i++) {
if (fib[i] % 3 == 0) {
answer++;
}
}
System.out.println(answer);
}
public static void test2() { //测试:fib[100]爆long数组
long fib[] = new long[102];
fib[0] = 0;
fib[1] = fib[2] = 1;
for (int i = 3; i < 102; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
System.out.println(i + ":" + fib[i]);
}
int answer = 0;
for (int i = 1; i <= 100; i++) {
if (fib[i] % 3 == 0) {
answer++;
}
}
System.out.println(answer);
}
public static void test3() {
BigInteger arr[] = new BigInteger[2025]; // int型与long型数据均会爆数组
arr[0] = BigInteger.ZERO;
arr[1] = arr[2] = BigInteger.ONE;
for (int i = 3; i <= 2020; i++) {
arr[i] = arr[i - 1].add(arr[i - 2]);
}
int answer = 0;
BigInteger three = new BigInteger("3");
for (int i = 1; i <= 100; i++) {
if (arr[i].mod(three).equals(arr[0])) {
answer++;
//
}
}
System.out.println(answer);
}
}
试题F
问题描述
小Hi的公司经常举办回馈社会的爱心活动。这次小Hi作为志愿者带领社区的孩子们参观了青少年天文馆。他发现孩子们对于摩尔斯电码非常感兴趣。
摩尔斯电码由两种基本的信号组成:短信号"滴"(用字符’.‘表示)以及长信号"嗒"(用字符’-'表示)。下图是数字0-9的摩尔斯电码表示,每个数字都由5个字符组成:
.---- …— …-- …- … -… --… —… ----. -----
1 2 3 4 5 6 7 8 9 0
为了让孩子们开心,小Hi决定把每位孩子的生日日期转化为摩尔斯码赠送给他们。例如日期20210101对应的摩尔斯电码是:
…— ----- …— .---- ----- .---- ----- .----
你能写一个程序帮助小Hi吗?
输入格式
第一行是一个整数N,代表参加活动的孩子的人数。(1 <= N <= 100)
以下N行每行一个由0-9组成的字符串,代表一个生日日期。(日期格式:yyyymmdd,日期范围: 20000101至20210101)
输出格式
对于每个生日日期,输出一行表示转化后的摩尔斯码,数字之间用一个空格隔开。
样例输入
2
20161011
20000101
样例输出
…— ----- .---- -… .---- ----- .---- .----
…— ----- ----- ----- ----- .---- ----- .----
import java.util.Scanner;
public class F4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 1 <= N <= 100
String str[] = { "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----." }; // 0对应的字符串在开头
String[] strs=new String[N];
for (int i = 0; i < N; i++){
String s = sc.next();
strs[i]=s;
}
for (int i = 0; i < N; i++) { // 由0-9组成的字符串,日期范围:20000101至20210101
char strArray[] = strs[i].toCharArray();
for (int j = 0; j < 8; j++) { // [0, 8] 遍历字符数组,取出每一个字符
int index = (int) (strArray[j] - '0'); // 字符串数组的下标
if (j == 7) { // 若是输出最后的字符串,则末尾不加空格
System.out.print(str[index]);
} else {
System.out.print(str[index] + " ");
}
}
System.out.println();
}
}
}
试题H
问题描述
给定一个序列 (a_1, a_2, …, a_n), 定义序列中的一个递增三元组是指三个下标 i, j, k 对应的三个元素 a_i, a_j, a_k,这三个元素满足 a_i < a_j < a_k。
例如序列 (1, 1, 4, 3, 2, 4) 有以下 4 个递增三元组:
1. 下标 1, 4, 6 对应的 1, 3, 4;
2. 下标 1, 5, 6 对应的 1, 2, 4;
3. 下标 2, 4, 6 对应的 1, 3, 4;
4. 下标 2, 5, 6 对应的 1, 2, 4。
注意,可能有下标不同,但对应数值相同的三元组,他们应当算成不同的三元组。
给定序列,请问序列中一共有多少个不同的递增三元组。
输入格式
输入第一行包含一个整数 n,表示序列的长度。
第二行包含 n 个整数 a_1, a_2, …, a_n,表示给定的序列。
输出格式
输出一行,包含一个整数,表示序列中的递增三元组数量。请注意答案可能很大,可能超过 32 位二进制整数的范围,建议使用 64 位二进制整数。
样例输入
6
1 1 4 3 2 4
样例输出
4
数据规模和约定
对于 30% 的评测用例,1 <= n <= 20, 0 <= a_i <= 10。
对于 50% 的评测用例,1 <= n <= 1000, 0 <= a_i <= 100。
对于 80% 的评测用例,1 <= n <= 10000, 0 <= a_i <= 100。
对于所有评测用例,1 <= n <= 100000, 0 <= a_i <= 100。
import java.util.Scanner;
public class Sanyuanzu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int array[] = new int[n];
for (int i = 0; i < n; i++) {
array[i] = sc.nextInt();
}
Long answer = 0L; // 答案可能很大,建议使用64位二进制整数
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
if (array[i] < array[j] && array[j] < array[k]) {
answer++;
}
}
}
}
System.out.println(answer);
}
}