【牛客刷题】笔记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;
}
相关推荐
Wx120不知道取啥名15 分钟前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
Iareges44 分钟前
美团2025校招 广告算法工程师 面经
算法·面试·求职招聘·笔试·秋招
IT规划师2 小时前
数据结构 - 散列表,三探之代码实现
数据结构·散列表·哈希表
堇舟2 小时前
斯皮尔曼相关(Spearman correlation)系数
人工智能·算法·机器学习
西几3 小时前
代码训练营 day48|LeetCode 300,LeetCode 674,LeetCode 718
c++·算法·leetcode
武子康3 小时前
大数据-187 Elasticsearch - ELK 家族 Logstash Filter 插件 使用详解
大数据·数据结构·elk·elasticsearch·搜索引擎·全文检索·1024程序员节
liuyang-neu3 小时前
力扣第420周赛 中等 3324. 出现在屏幕上的字符串序列
java·算法·leetcode
想做白天梦4 小时前
双向链表(数据结构与算法)
java·前端·算法
小卡皮巴拉4 小时前
【力扣刷题实战】相同的树
c语言·算法·leetcode·二叉树·递归
zyhomepage4 小时前
科技的成就(六十四)
开发语言·人工智能·科技·算法·内容运营