oppo笔试 oppo笔试题 0810
笔试时间:2024年08月10日
历史笔试传送门:2023秋招笔试合集
第一题
题目
有一条长度为n的河流,小O初始位于左岸边(即河流左侧的位置),他想要跨越到河的对岸(即河流右侧的位置)。河上有一些石头可以供小O踩在上面。小O只能踩在石头或者岸边,他想知道他在能跨到河对岸的情况下,最长的一步最短是多少。
输入描述
第一行输入一个整数n代表河流的长度。
第二行输入n个正整数a1,a2...an 代表是否是石头,如果ai= 1,则说明当前位置是石头,可以踩;否则是水流,不能踩。
输出描述
在一行上输出一个整数,表示最长的一步的最小值。
样例输入一
5
0 1 0 1 1
样例输出一
2
样例输入二
8
0 1 1 0 0 0 1 1
样例输出二
4
参考题解
求数组中任意两个1之间最大间隔了多少个0,然后加一即可。所以只需要顺序遍历一遍数组,用一个变量cur记录数组中前一个1的位置,如果当前的数是1,就计算两个1之间的间隔,更新答案即可。这里需要注意的是,河的右端也是可以站立的,所以如果数组的后缀全是0,还需要更新一次答案。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 200010;
int a[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int cur = 0;
int res = 1;
for (int i = 1; i <= n; i++) {
if (a[i] == 1) {
res = max(res, i - cur);
cur = i;
}
}
// 如果最后一个元素不是1,还需要更新一次
if (cur != n) res = max(res, n - cur + 1);
cout << res;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
int cur = 0;
int res = 1;
for (int i = 1; i <= n; i++) {
if (a[i] == 1) {
res = Math.max(res, i - cur);
cur = i;
}
}
if (cur != n) {
res = Math.max(res, n - cur + 1);
}
System.out.println(res);
sc.close();
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
def main():
import sys
input = sys.stdin.read
data = list(map(int, input().split()))
n = data[0]
a = data[1:]
cur = 0
res = 1
for i in range(n):
if a[i] == 1:
res = max(res, i - cur + 1)
cur = i + 1 # 1-based index to 0-based
if cur <= n:
res = max(res, n - cur + 1)
print(res)
if __name__ == "__main__":
main()
第二题
题目
小O有一个长度为n的数组a,他在数组x上定义了一个函数f(x),表示数组x中所有元素做按位|(或)运算的结果。
小O现在希望将数组a分割成尽可能少的段,使得所有段的f函数值中的最大值不超过k,请问他最少可以将a分为几段,请你帮帮他吧。
输入描述
输入包含两行。
第一行两个整数,分别表示数组的长度,以及每段f函数值的上限。
第二行n个正整数ai,表示数组a的元素。
输出描述
在一行上输出一个整数,表示最少能分成多少段。如果无法分段,输出-1。
样例输入一
4 8
1 2 4 8
样例输出一
2
说明:
可以分成两段:[[1,2,4], [8]]
样例输入二
4 3
1 2 4 8
样例输出二
-1
参考题解
贪心。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
using namespace std;
const int N = 200010;
int a[N];
int main() {
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++)
scanf("%d", a + i);
int cur = 0;
int res = 0;
for (int i = 0; i < n; i++) {
int t = cur | a[i];
if (t > k) {
res++;
cur = a[i];
if (cur > k) {
res = -1;
break;
}
} else {
cur = t;
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。
