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%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

07-09 18:28
门头沟学院 Java
写着提前批,结果还要实习4个月以上???
程序员牛肉:这种不用看,直接投了,面试的时候问对应的HR就行。有可能他们是直接复制的暑期实习的模板。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务