【算法刷题指南】模拟



前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站




🌈个人主页: 南桥几晴秋
🌈C++专栏: 南桥谈C++
🌈C语言专栏: C语言学习系列
🌈Linux学习专栏: 南桥谈Linux
🌈数据结构学习专栏: 数据结构杂谈
🌈数据库学习专栏: 南桥谈MySQL
🌈Qt学习专栏: 南桥谈Qt
🌈菜鸡代码练习: 练习随想记录
🌈git学习: 南桥谈Git

🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 本科在读菜鸡一枚,指出问题及时改正



1576.替换所有的问号

1576.替换所有的问号

  • 遍历字符串
  • 找到当前位置是'?'
  • 分为三种情况:
    • i==0,成立条件:ch!=s[i+1]
    • i==s.size()-1,成立条件:ch!=s[s.size()-2]
    • 处于中间位置,成立条件:ch!=s[i-1]&&ch!=s[i+1]
cpp 复制代码
class Solution {
public:
    string modifyString(string s) {
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='?')
            {
                for(char ch='a';ch<='z';ch++)
                {
                    if(i==0)
                    {
                        if(ch!=s[i+1]) s[i]=ch;
                    }
                    else if(i==s.size()-1)
                    {
                        if(ch!=s[s.size()-2]) s[i]=ch;
                    }
                    else
                    {
                        if(ch!=s[i-1]&&ch!=s[i+1]) s[i]=ch;
                    }
                }
            }
        }
        return s;
    }
};

495.提莫攻击

495.提莫攻击

  • 当前时间和前一个时间的差值大于等于duration,中毒时间为duration
  • 当前时间和前一个时间的差值小于duration,中毒时间需要重置
  • 最后一个时间要加上duration
cpp 复制代码
class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int ans=0;
        for(int i=1;i<timeSeries.size();i++)
        {
            if(timeSeries[i]-timeSeries[i-1]>=duration) ans+=duration;
            else ans+=timeSeries[i]-timeSeries[i-1];
        }
        return ans+duration;
    }
};

6.Z 字形变换

6.Z 字形变换

  • 模拟
  • 找规律:
    • 第一行:每两个之间的间隔为d=2*numRows-2
    • 中间行:每两个竖列的间隔为d,斜列和竖列之间的间隔为d-i*2i是每一行)
    • 最后一行:每两个之间的间隔为d=2*numRows-2
  • 注意:在判断斜列的时候需要注意是否超出字符串的大小
cpp 复制代码
class Solution {
public:
    string convert(string s, int numRows) {
        int n=s.size();
        string ans;
        int d=2*numRows-2;
        if(numRows==1) return s;
        //第一行
        for(int i=0;i<n;i+=d)
        {
            ans+=s[i];
        }
        //中间行
        for(int i=1;i<numRows-1;i++)
        {
            for(int j=i;j<n;)
            {
                ans+=s[j];
                int dd=d-i*2;
                if(j+dd<n)
                    ans=ans+s[j+dd];
                j+=d;
            }
        }
        //最后一行
        for(int i=numRows-1;i<n;i+=d)
            ans+=s[i];

        return ans;
    }
};

38.外观数列

38.外观数列

  • 模拟
  • 根据概念推出规律:
cpp 复制代码
1
11 
21
1211
111221
312211
...
  • 实质上就是依次统计连续相同字符的个数
cpp 复制代码
class Solution {
public:
    string countAndSay(int n) {
        string s="1";
        for(int i=1;i<n;i++)
        {
            string t;
            for(int right=0,left=0;right<s.size();)
            {
                while(right<s.size()&&s[left]==s[right]) right++;
                t+=to_string(right-left)+s[left];
                left=right;
            }
            s=t;
        }
        return s;
    }
};

1419.数青蛙

1419.数青蛙

  • 模拟,遍历字符串
  • 遍历到roak找前驱字符是否在哈希表中存在:
    • 存在:前驱个数--,当前字符个数++
    • 不存在:返回-1
  • 遍历到c时:找最后一个字符k是否在哈希表中存在:
    • 存在:最后一个字符的个数--,当前字符c++
    • 不存在:当前字符++
cpp 复制代码
class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        string t="croak";
        int n=t.size();
        vector<int>hash(n);  //数组模拟哈希表(记录t)
        unordered_map<char,int> index; //记录下标
        for(int i=0;i<n;i++)
            index[t[i]]=i;

        for(auto ch:croakOfFrogs)
        {
            if(ch=='c')
            {
                if(hash[n-1]!=0) hash[n-1]--;
                hash[0]++; //c
            }
            else
            {
                int i=index[ch];
                if(hash[i-1]==0) return -1; //前驱字符不存在
                hash[i-1]--;hash[i]++;
            }
        }
        for(int i=0;i<n-1;i++)
        {
            if(hash[i]!=0) return -1;
        }
        return hash[n-1];
    }
};
相关推荐
旖-旎1 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~1 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎1 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏2 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
可靠的仙人掌2 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
c238562 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练:【二分答案】案例2:木材加工
c++·二分答案·csp·高频考点·信奥赛·木材加工
海石4 小时前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode
海石4 小时前
JS击败94%,Hard题想不到动态规划,那就用数组和栈试试
算法·leetcode
aaPIXa6224 小时前
C++模板元编程:编译期计算Fibonacci数列
java·开发语言·c++