【牛客刷题】笔记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;
}
相关推荐
智者知已应修善业21 分钟前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
洛水水24 分钟前
【力扣100题】86.柱状图中最大的矩形
算法·leetcode·职场和发展
渡之31 分钟前
GRiM-Net 深度解析 | 无人机 GNSS 拒止场景下两阶段跨视角视觉定位框架
深度学习·算法·动态规划·无人机
测试仪器廖生135902563851 小时前
罗德与施瓦茨 FSP13频谱分析仪FSP30
网络·人工智能·算法
happymaker06261 小时前
LeetCodeHot100——560.和为K的子数组
算法
dtq04241 小时前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
郭梧悠1 小时前
Hash算法入门Hash冲突解决方案
算法·哈希算法
洛水水2 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
happymaker06262 小时前
LeetCodeHot100——155.最小栈
算法
洛水水3 小时前
【力扣100题】85.每日温度
算法·leetcode·职场和发展