2024oppo春季笔试真题

本文为原创内容,转载请注明出处并附带原文链接。感谢您的尊重与支持!

你必须非常努力,才能看起来毫不费劲。


1.小欧新建文件夹

题目描述

小欧在创建文件夹,需要输入文件夹的名字。

比如先创建名字为“abc”的文件夹,那么此时就有一个文件夹名字为“abc”。

如果存在相同名字的文件夹,则在名字后面加上一个正整数,比如“abc”已经存在,那么此时创建的文件夹名字为“abc(1)”。

如果“abc(1)”也存在,那么此时创建的文件夹名字为“abc(2)”。

以此类推。请你帮助小欧创建文件夹。

输入描述

第一行输入一个正整数n,表示创建文件夹的数量。

接下来n行,每行输入一个仅包含小写字母的字符串,表示要创建的文件夹名字,字符串长度不超过10且不为空。

1 <= n <= 10^4

输出描述

输出n行,每行输出一个字符串,表示创建的文件夹名字。

输入示例

5
abc
abc
abc
vfd
dsf

输出示例

abc
abc(1)
abc(2)
vfd
dsf

提示信息

按照输入顺序判断每次创建的文件夹的名字即可。

总时间限制:py/php/js: 5s; java/go: 3s; c/c++: 2s

请尽量使用快读减少输入输出的时间。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
String x = sc.nextLine();
StringBuilder sb = new StringBuilder(x);
if (map.containsKey(x)) {
sb.append('(');
sb.append(map.get(x));
sb.append(')');
}
map.put(x, map.getOrDefault(x, 0) + 1);
System.out.println(sb.toString());
}
}
}

2.小欧的等差数列

题目描述

小欧有一个长度为n,首项为a,公差为d的等差数列。即a, a+d, a+2d, … ,a+(n-1)d。

现在,小欧把这n个数看作一个集合,每次操作可以从集合中任意选两个数ai, aj,如果 ai+aj是偶数,那么可以将(ai+aj) / 2
加入到集合中。

小欧想知道,经过若干次操作后,集合中最多能有多少个数。

输入描述

一行三个整数n, a, d,表示等差数列的长度,首项和公差。

1 <= n <= 10^5

1 <= a, d <= 10^9

输出描述

输出一个整数,表示集合中最多能有多少个数。

输入示例

5 1 2

输出示例

9

提示信息

刚开始集合为{1,3,5,7,9}。

选1和3 => 2

选3和5 => 4

选5和7 => 6

选7和9 => 8

生成的数如2,4,6,8也可以选,但是可以证明,不管你怎么选,你生成不了超过9的数。

所以最终的集合为{1,2,3,4,5,6,7,8,9}。注意:集合中不能包含重复的数。

时间限制:c/c++:1s; 其他语言:2s.

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;

public class Main {
public static void main(String[] args) {
/**
* 数学题。分别讨论以下四种情况就行:
* 1.首项为奇数,公差为奇数: 结果为 n
* 2.首项为偶数,公差为奇数: 结果为 n
* 3.首项为奇数,公差为偶数: 每次结果为 n + (n - 1)
* 4.首项为偶数,公差为偶数: 每次结果为 n + (n - 1)
*/
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a = sc.nextInt();
int d = sc.nextInt();
// 要判断多次 d 是否为偶数,并将 n 改为 2n - 1
while (d % 2 == 0) {
n += n - 1;
d /= 2;
}

System.out.println(n);

}
}

3.小欧的弹球

题目描述

给定两个互相垂直的墙壁,可视为x轴和y轴的正半轴。小欧目前在(x1,
y1)上面放置了一个弹球,她希望弹球分别经过y轴和x轴各反弹一次后到达(x2,y2),小欧可以自行选择弹球发射的方向,你能帮小欧求出第一次碰到的墙壁时的弹球坐标吗?

题目保证输入的数据有解。

提示1:当球碰到墙壁时,它将和法线对称的方向弹出。如果不了解的,可以去看看光的反射原理。这个题目可以理解为光以一定的入射角照射到一个光滑的镜面上.

输入描述

四个正整数x1, y1, x2, y2,分别代表弹球的起始点和目标点。

1 <= x1, x2, y1, y2 <= 10^9

输出描述

两个浮点数,分别代表第一次碰到墙壁的横坐标和纵坐标。

提示2:结果保留两位小数,如果你的结果为整数,也需要保留两位小数。

输入示例

1 1 2 1

输出示例

0.00 0.33

提示信息

111

提示3:计算出来的坐标应该是(0,1/3),所以应该输出0.00 0.33

总时间限制:c/c++: 1s,其他语言:2s.

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.*;
import java.util.*;

public class Main {
public static void main(String[] args) {
/**
纯数学几何结合题:

首先根据光的反射原理,设有A(x1, y1), B(x2, y2)两点,我们要求的是从A点朝Y轴发射一条光线, 使其经过Y轴的反射到X轴,再经过X轴的反射,最后到达B点。

假设A点与Y轴的反射点为(0,b),与X轴的反射点为(c,0)。 与Y轴的反射点的夹角的锐角部分为α,那么其与法线的夹角为β,而α+β=90°, 所以可以知道在经过X轴反射过后光线与X轴的夹角也是β,由于题目保证数据存在正整数解, 所以这两条光线是平行的,根据三角函数公式可知:

1.tanβ=y2/(x1-c)
2.tanβ=(y1-b)/x1
3.tanβ=b/c

联立上面三个方程可以求得b = (x2 * y1 - x1 * y2) / (x1 + x2)
所求答案即为(0.00,b)。

*/
Scanner read = new Scanner(System.in);
double x1 = read.nextDouble();
double y1 = read.nextDouble();
double x2 = read.nextDouble();
double y2 = read.nextDouble();
double b = (x2 * y1 - x1 * y2) / (x1 + x2);
System.out.print("0.00 ");
System.out.printf("%.02f\n", b);
}
}