京东笔试 京东秋招 京东笔试题 0920

笔试时间:2025年9月20日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:发粽子

题目描述:端午节要到了,粽子店针对小朋友研发了一种卡通粽子。为了打广告,店铺举办了一个活动:

  • 前 n+1 个索要粽子的小朋友都是可以拿到粽子的。
  • 每一个小朋友都至少要发一个粽子。

还有一个抽卡环节:粽子店准备了 n 张卡,前 n 个小朋友会分别取一张。

卡片有两种:

  1. '+' :抽到这张卡意味着下一个小朋友拿到的粽子比自己多。
  2. '-' :抽到这张卡意味着下一个小朋友拿到的粽子比自己少。

粽子店会在前 n 个小朋友都抽完卡以后统一发放粽子。

请问:粽子店最少需要发放多少粽子,才能符合抽卡的结果?

输入描述

输入第一行仅包含一个正整数 n,表示卡片的数量。

输入第二行是一个长度为 n 的字符串,仅包含 '+' 和 '-' 两种符号。

数据范围:1 <= n <= 500000

输出描述

输出一个正整数,表示粽子店最少发出的粽子数量。

样例输入

3

--+

样例输出

8

样例说明: 最少的发放方案为 {3, 2, 1, 2},总共发放 3 + 2 + 1 + 2 = 8 个粽子。

参考题解

解题思路:

  1. 用一个数组 candy 保存每个小朋友的粽子数,初始都为 1(保证至少一个)。
  2. 从左到右扫描:如果当前位置卡片是 '+',说明下一个小朋友要比当前多,所以让 candy[i+1] = candy[i] + 1。
  3. 从右到左扫描:如果当前位置卡片是 '-',说明下一个小朋友要比当前少,所以保证 candy[i] >= candy[i+1] + 1。用 max 保证不破坏之前的约束。
  4. 最后把所有小朋友的 candy[i] 加起来就是最少需要的粽子数量。

C++:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    
    vector<long long> candy(n + 1, 1);
    
    // 从左到右处理 '+'
    for (int i = 0; i < n; i++) {
        if (s[i] == '+') {
            candy[i + 1] = candy[i] + 1;
        }
    }
    
    // 从右到左处理 '-'
    for (int i = n - 1; i >= 0; i--) {
        if (s[i] == '-') {
            candy[i] = max(candy[i], candy[i + 1] + 1);
        }
    }
    
    long long ans = 0;
    for (int i = 0; i <= n; i++) {
        ans += candy[i];
    }
    
    cout << ans << endl;
    return 0;
}

Java:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = sc.next();
        
        long[] candy = new long[n + 1];
        Arrays.fill(candy, 1);
        
        // 从左到右处理 '+'
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == '+') {
                candy[i + 1] = candy[i] + 1;
            }
        }
        
        // 从右到左处理 '-'
        for (int i = n - 1; i >= 0; i--) {
            if (s.charAt(i) == '-') {
                candy[i] = Math.max(candy[i], candy[i + 1] + 1);
            }
        }
        
        long ans = 0;
        for (int i = 0; i <= n; i++) {
            ans += candy[i];
        }
        
        System.out.println(ans);
    }
}

Python:

n = int(input())
s = input()

candy = [1] * (n + 1)

# 从左到右处理 '+'
for i in range(n):
    if s[i] == '+':
        candy[i + 1] = candy[i] + 1

# 从右到左处理 '-'
for i in range(n - 1, -1, -1):
    if s[i] == '-':
        candy[i] = max(candy[i], candy[i + 1] + 1)

ans = sum(candy)
print(ans)

第二题:老张的景点规划

题目描述:爱旅游的老张来到了我国西南地区的某个城市旅游。这个城市以海拔落差大著称,同一个城市内既能领略雪山的伟岸,又能欣赏平原溪流的静谧。

老张提前在网上做好了攻略,掌握了这个城市所有

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

09-06 11:38
已编辑
门头沟学院 Java
牛客30894172...:第一题简单,直接看有多少奇数个字符,不过只能过45%
投递京东等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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