25届-08.10-OPPO-(改编题)

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 合集传送们 -> 🧷学长刷题笔记

🍒 本专栏已收集 140+ 套题 🍄 题面描述等均已改编,如果和你实际看到的题面描述不一样请理解,做法和题目本质基本不变。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

1️⃣ 第一题计数相关,比较简单

2️⃣ 第二题看着很复杂,但是注意到数据范围,可以直接猜结论

3️⃣ 第三题是一个大整数的模拟,可以预处理前后缀来解决

🍑 01.K小姐的快乐时光

问题描述

K小姐是一位热爱生活的年轻女性。她每天都会记录自己的心情指数,用正数表示心情愉悦,0或负数表示心情不佳。现在,K小姐想知道在她的心情记录中,有多少个连续的时间段里她的心情一直保持愉悦。

输入格式

第一行包含一个整数 ,表示K小姐记录心情的天数。

第二行包含 个整数,用空格分隔,表示K小姐每天的心情指数。

输出格式

输出一个整数,表示K小姐心情愉悦的连续时间段的数量。

样例输入

4
1 2 0 3

样例输出

4

数据范围

  • 每个整数的绝对值不超过

题解

这道题目的核心是计算连续正数序列可以形成的区间数量。我们可以遍历整个数组,当遇到正数时,继续向后遍历;当遇到非正数时,计算之前连续正数序列可以形成的区间数量。

对于一个长度为 的连续正数序列,它可以形成的区间数量为 。这是因为我们可以选择序列的起始位置( 种选择)和结束位置(从起始位置到序列末尾的任意位置),总共有 种可能。

算法步骤如下:

  1. 初始化计数器 和起始位置
  2. 遍历数组,对于每个元素:
    • 如果元素小于等于0,计算之前连续正数序列的区间数,更新 ,并将 设置为下一个位置。
    • 如果遍历到数组末尾,计算最后一个连续正数序列的区间数,更新
  3. 返回

时间复杂度:,其中 是数组的长度。 空间复杂度:,只使用了常数额外空间。

参考代码

  • Python
def count_happy_periods(n, moods):
    """
    计算K小姐心情愉悦的连续时间段数量
    
    Args:
    n (int): 记录天数
    moods (List[int]): K小姐每天的心情指数列表
    
    Returns:
    int: 心情愉悦的连续时间段数量
    """
    count = 0
    start = 0
    
    for i in range(n):
        if moods[i] <= 0:
            # 计算之前连续正数序列的区间数
            length = i - start
            count += (length * (length + 1)) // 2
            start = i + 1
    
    # 处理最后一个连续正数序列
    length = n - start
    count += (length * (length + 1)) // 2
    
    return count

# 读取输入
n = int(input())
moods = list(map(int, input().split()))

# 计算结果
result = count_happy_periods(n, moods)

# 输出结果
print(result)
  • Java
import java.util.Scanner;

public class Main {
    /**
     * 计算K小姐心情愉悦的连续时间段数量
     * 
     * @param n 记录天数
     * @param moods K小姐每天的心情指数数组
     * @return 心情愉悦的连续时间段数量
     */
    public static int countHappyPeriods(int n, int[] moods) {
        int count = 0;
        int start = 0;
        
        for (int i = 0; i < n; i++) {
            if (moods[i] <= 0) {
                // 计算之前连续正数序列的区间数
                int length = i - start;
                count += (length * (length + 1)) / 2;
                start = i + 1;
            }
        }
        
        // 处理最后一个连续正数序列
        int length = n - start;
        count += (length * (length + 1)) / 2;
        
        return count;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] moods = new int[n];
        
        for (int i = 0; i < n; i++) {
            moods[i] = scanner.nextInt();
        }
        
        int result = countHappyPeriods(n, moods);
        System.out.println(result);
        
        scanner.close();
    }
}
  • Cpp
#include <iostream>
#include <vector>

using namespace std;

/**
 * 计算K小姐心情愉悦的连续时间段数量
 * 
 * @param n 记录天数
 * @param moods K小姐每天的心情指数向量
 * @return 心情愉悦的连续时间段数量
 */
int countHappyPeriods(int n, const vector<int>& moods) {
    int count = 0;
    int start = 0;
    
    for (int i = 0; i < n; i++) {
        if (moods[i] <= 0) {
            // 计算之前连续正数序列的区间数
            int length = i - start;
            count += (length * (length + 1)) / 2;
            start = i + 1;
        }
    }
    
    // 处理最后一个连续正

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

本专栏短期内不再更新,请勿继续订阅

全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
6
5
分享

创作者周榜

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