当前位置: 首页 > article >正文

算法笔记day10

目录

1.牛牛冲钻五

2.最长无重复子数组_牛客题霸_牛客网

3.重排字符串


1.牛牛冲钻五

算法思路:

特别简单的模拟题,没什么说的。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{    
    int t = 0;
    cin >> t;
    while(t)
    {
        int n ,k ;
        cin >> n >> k;
        string s;
        cin >> s;
        int ret = 0;
        int cnt = 0;
        for(int i = 0; i < n; i++)
        {
            if(s[i] == 'W')
            {
                cnt++;
                if(cnt >= 3)
                {
                    ret += k;
                }
                else
                {
                    ret += 1;
                }
            }
            else
            {
                cnt = 0;
                ret -= 1;
            }  

        }
        cout << ret << endl;
        t--;
    }
    return 0;
}

2.最长无重复子数组_牛客题霸_牛客网

算法思路:

这是一道滑动窗口的题目,只需分析好,什么时候入窗口,什么时候出窗口,什么时候更新返回值。

维护一个窗口,窗口内的元素不会重复,一定会用到哈希表。

入窗口:hash[right]++,将当前元素存储到哈希表中。

出窗口:hash[left]--,将当前元素存从哈希表中删除,直到窗口内没有重复元素。

class Solution {
public:
    
    int maxLength(vector<int>& arr) 
    {
        unordered_map<int,int> map;

        int left = 0, right = 0;
        int ret = 0;
        for(right; right < arr.size(); right++)
        {
            map[arr[right]]++;//入窗口

            while(map[arr[right]] > 1 && left < right)//出窗口
            {
                map[arr[left]]--;
                left++;
            }
            ret = max(ret, right - left + 1);//维护返回值
        } 
        return ret;
    }
};

3.重排字符串

算法思路:

1.判断字符串是否能重排

一定要想到 出现次数最多的字符,如果一个字符出现次数超过一个临界值,就无法进行重排。

将字符串分为,出现最多的字符,和其他字符,将出现最多的字符和其他字符,两个组成一组,这样不就能保证,无相邻的相同字符。

举例: abbcccc

ca cb cb c:找规律发现,只要出现最多的字符  <=(n + 1)/ 2 ,那么就能重排

2.重排

先将出现最多的字符,间隔放置 ,c_ c_ c_c,再将其他字符填入空中

#include <iostream>
#include <string>

using std::string;
using std::cout;
using std::endl;
using std::cin;


int hash[26] = { 0 }; //记录字母出现的次数
string s;

string ret;//返回值
int n = 0;


int main()
{
    cin >> n >> s;
    
    char maxChar = 0;//出现最多次数的字符
    int maxCount = 0;//最多的次数
    for(int i = 0; i < n; i++)
    {
        int index = s[i] -'a';
        if(++hash[index] > maxCount)
        {
            maxChar = s[i];
            maxCount = hash[index];
        }
    }
    
    
    if(maxCount > (n + 1) / 2)
    {
        cout << "no" << endl;
    }
    else
    {
        cout << "yes" << endl;
        ret.resize(n);
        int index = 0;
        while(maxCount--)// 处理出现最多次的字符
        {
            ret[index] = maxChar;
            index += 2;
        }
        
        
        for(int i = 0; i <26 ; i++)//处理其他字符
        {
            if(hash[i] && i + 'a' != maxChar)
            {
                while(hash[i]--)
                {
                    if(index >= n)
                    {
                        index = 1;
                    }
                    
                    ret[index] = i + 'a';
                    index += 2;
                }
            }
        }
        cout << ret << endl;
    }    
    
    return 0;
}


http://www.kler.cn/a/376618.html

相关文章:

  • ClkLog企业版(CDP)预售开启,更有鸿蒙SDK前来助力
  • 私有化视频平台EasyCVR视频汇聚平台接入RTMP协议推流为何无法播放?
  • git reset 删除错误提交
  • Nature Methods | 新型三维光场显微成像技术
  • 微服务核心——网关路由
  • Serverless + AI 让应用开发更简单
  • CentOS下Redis简洁安装(无坑版)
  • LocalDate 类常用方法详解(日期时间类)
  • 图文深入介绍Oracle DB link(三)
  • Python世界:自动化办公Word之批量替换文本生成副本
  • C++ 实现俄罗斯方块游戏
  • 贪心算法习题其二【力扣】【算法学习day.19】
  • Selenium自动化测试框架(附教程+文档)
  • Rust 力扣 - 2134. 最少交换次数来组合所有的 1 II
  • 游戏光照的专业知识解析
  • 网络学习/复习3序列化与反序列化/HTTP/HTTPS
  • 了解SQLExpress数据库
  • 文件系统(IO-进程-线程)
  • shodan-4
  • Milvus - GPU 索引类型及其应用场景
  • Soft TeacherEnd-to-End Semi-Supervised Object Detection with Soft Teacher
  • wireshark抓包查看langchain的ChatOpenAI接口发送和接收的数据
  • P3-2.【结构化程序设计】第二节——知识要点:多分支选择语句
  • 详解ARM64可执行程序的生成过程
  • 猫头虎分享Python 编码转换库:处理 JSONL 编码格式转换的最佳实践
  • 如何压缩pdf文件的大小?5分钟压缩pdf的方法推荐