【牛客刷题】笔记1

目录

1、数组中两个字符串的最小距离

2、dd爱框框

3、除2!


1、数组中两个字符串的最小距离

数组中两个字符串的最小距离_牛客题霸_牛客网 (nowcoder.com)

我们可以使用一个i来遍历数组,并用prev1来记录字符串1在上一次出现的下标,prev2记录字符串2在上一次出现的下标,prev1和prev2都初始化为-1,因为最先开始还每遍历,并不知道第一个字符串1和第一个字符串2在哪里。当i指向的值是prev1时,计算一下i到prev2的距离,并与ans取小,再将prev1的值改成i,当i指向的值是prev2时也是同理。

复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    int n; cin >> n;
    string str1, str2; cin >> str1 >> str2;
    int ans = 0x3f3f3f3f, prev1 = -1, prev2 = -1;
    for(int i = 0;i < n;i++)
    {
        string str; cin >> str;
        if(str == str1)
        {
            if(prev2 != -1) ans = min(ans, i - prev2);
            prev1 = i;
        }
        else if(str == str2)
        {
            if(prev1 != -1) ans = min(ans, i - prev1);
            prev2 = i;
        }
    }
    if(ans == 0x3f3f3f3f) cout << -1 << endl;
    else cout << ans << endl;
    return 0;
}

2、dd爱框框

dd爱框框 (nowcoder.com)

这道题就是使用滑动窗口。当窗口中值的和小于x时,入窗口。当窗口中的值大于等于x时,先更新结果,再出窗口,直到窗口中的值小于x,出窗口完毕,再继续入窗口。为了将区间长度与区间左右端点对应起来,我们可以使用unoredered_map

复制代码
#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;

const int N = 1e7 + 10;
int n, x, a[N];

int main() {
    unordered_map<int, pair<int, int>> up;
    scanf("%d%d", &n, &x);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]); // 注意:下标是从1开始的
    int l = 1, r = 1, sum = 0, m = 0x3f3f3f3f;
    while (r <= n)
    {
        while (r <= n && sum < x) sum += a[r++]; // 入窗口
        while (l <= r && sum >= x) // 出窗口
        {
            m = min(m, r - l); // m用来存储mp中的最小值
            if (!up.count(r - l)) up[r - l] = { l, r - 1 }; // 若没有则加入
            sum -= a[l++];
        }
    }
    // cout << up[m].first << " " << up[m].second << endl;
    printf("%d %d\n", up[m].first, up[m].second);
    return 0;
}

3、除2!

除2! (nowcoder.com)

这道题很明显就是每次将数组中最大的偶数除以2,直到数组中没有偶数了,或者已经进行了k次操作。所以,我们使用一个大根堆来存储数组中的偶数,而奇数不放入大根堆,我们开一个sum来存储奇数。注意,这个sum一定要是long long类型的,因为有1e5个数,而每个数的最大值是1e9。每次操作,取出堆顶的元素,将其除以2,若结果是偶数,则再放回堆,若结果是奇数,则加入sum。直到进行了k次操作或者还没进行k次操作堆中就已经没有元素了,若是进行了k次操作结束的,堆中可能还有元素,最后需要将这些元素加入sum。最终sum就是结果

复制代码
#include <iostream>
#include <queue>
using namespace std;

int n, k;

int main() {
    long long sum = 0;
    priority_queue<int> pq;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
    {
        int x; cin >> x;
        if (x % 2 == 1) sum += x;
        else pq.push(x);
    }
    while (k-- && !pq.empty())
    {
        int x = pq.top(); pq.pop();
        if ((x / 2) % 2 == 1) sum += (x / 2);
        else pq.push(x / 2);
    }
    while (!pq.empty())
    {
        sum += pq.top(); pq.pop();
    }
    printf("%lld\n", sum);
    return 0;
}
相关推荐
zyl7656 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖10 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌10 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F10 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791310 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032211 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!11 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
by2099911 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
2501_9269783311 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师11 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构