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

模拟练习题

模拟,顾名思义,这种题一般侧重于直接实现题目给的条件,即题目给什么,就实现什么。

替换所有的问号

1576. 替换所有的问号 - 力扣(LeetCode)

思路

从头到尾遍历字符串,如果看到问号,就对26个字母进行循环遍历,再排除里面不需要的字母即可。

代码

string modifyString(string s)
{
    int n = s.size();
    for (int i = 0; i < n; i++)
    {
        if (s[i] == '?')
        {
            for (char ch = 'a'; ch <= 'z'; ch++)
            {
                if ((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1]))
                {
                    s[i] = ch;
                    break;
                }
            }
        }
    }
    return s;
}

提莫攻击 

495. 提莫攻击 - 力扣(LeetCode)

思路

以如图为例,4-1 > duration ,两数字中间中毒状态即为duration

以如图为例,3-1<duration,两数字间中毒状态即为两数之间的距离3-1=2了

需要注意的是,最后一个元素需要再加一个duration,因为没有后面的间隔了。

代码

int findPoisonedDuration(vector<int>& timeSeries, int duration)
{
    int sum = 0, n = timeSeries.size(), dec = 0;
    for (int i = 1; i < n; i++)
    {
        dec = timeSeries[i] - timeSeries[i - 1];
        if (dec >= duration) sum += duration;
        else sum += dec;
    }
    return sum + duration;
}

Z字形变换 

6. Z 字形变换 - 力扣(LeetCode)

思路

我们可以将z字形的数画进一个矩阵,观察矩阵可得到,每一数列之间的公差d是2num-2(num是行数)。所以我们可以将每一行的数表示出来.

第一行和最后一行即为ret += s[i].

对于中间的num- 2行, 每一行一次循环有两个数,一个是k,另一个是t-k.

代码

string convert(string s, int numRows)
{
    //处理numRows等于1
    if (numRows == 1) return s;
    string ret;
    int d = 2 * numRows - 2, n = s.size();
    //第一行
    for (int i = 0; i < n; i += d)
        ret += s[i];
    for (int k = 1; k < numRows - 1; k++)
    {
        for (int i = k, j = d - k; i < n || j < n; i += d, j += d)
        {
            if (i < n) ret += s[i];
            if (j < n) ret += s[j];
        }
    }
    //最后一行
    for (int i = numRows - 1; i < n; i += d)
        ret += s[i];
    return ret;
}

外观数列

38. 外观数列 - 力扣(LeetCode)

思路

双指针,right碰到不相同的停止,相同的向右走,再将距离用to_string函数转化为字符加上左指针指向的字符,最后再将left指针跳到right指针即可。

代码

string countAndSay(int n)
{
    string ret = "1";
    for (int i = 1; i < n; i++)
    {
        string tmp;
        int len = ret.size();
        for (int left = 0, right = 0; right < len;)
        {
            while (ret[left] == ret[right]) right++;
            tmp += to_string(right - left) + ret[left];
            left = right;
        }
        ret = tmp;
    }
    return ret;
}

数青蛙

1419. 数青蛙 - 力扣(LeetCode)

思路

先用一个数组代替哈希表记录字符串t(t为青蛙的叫声这个字符串)中的每个字符,并且我们将分两种情况讨论:

(里面的数字1移动)(即前面--,后面++)

出现c,看最后一个字符k是否为0,如果不为0,说明已经至少出现了一只青蛙,如果为0,hash[0]++即可,代表已经出现了一个c,哈希表将其记录。

出现其他字符,如果前面存在其在哈希表顺序中的前面的字符,那么数字1向后移动。

对于任何一个在最后一个字符前面的位置,如果其值不为0,则直接返回-1即可,因为这代表叫声在这里面断了。

代码

int minNumberOfFrogs(string croakOfFrogs)
{
    string t = "croak";
    int n = t.size();
    vector<int> hash(n);//每一位代表t中的每一个字母,其值即为字符出现次数

    unordered_map<char, int> index;//x字符对应下标
    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]++;
        }
        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];
}


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

相关文章:

  • cmake foreach 条件判断
  • 浅谈云计算21 | Docker容器技术
  • git命令
  • 在 C# 中的Lambda 表达式
  • 【MySQL】数据库约束和多表查询
  • 人工智能-机器学习之多分类分析(项目实战二-鸢尾花的多分类分析)
  • BilibiliPotPlayer插件的登录第二天失效,无法看高清视频,要删掉浏览器上的cookie
  • Linux初识:【Linux软件包管理器yum】【Linux编辑器-vim的使用】【Linux编译器-gcc/g++的使用】
  • 精度论文:【Focaler-IoU: More Focused Intersection over Union Loss】
  • 生产环境中常用的设计模式
  • 可部署于所有设备上的开源加速 Stable-Diffusion.cpp:让 AI 图像生成更快、更高效!
  • AI刷题-小R的随机播放顺序、不同整数的计数问题
  • 二叉树总结(hot100)
  • 物联网通信协议对比-带表格
  • R数据分析:有调节的中介与有中介的调节的整体介绍
  • [ Spring ] Install Nacos on Ubuntu24
  • 【汇编语言】直接定址表(一)—— 「从单元标号到跨段数据:解锁汇编语言的隐藏技巧」
  • 【Rust自学】13.4. 闭包 Pt.4:使用闭包捕获环境
  • 信贷业务术语详解:深入理解金融领域的核心概念
  • js常用操作符
  • macOS安装的Ubuntu 20 VM虚拟机扩充磁盘的便捷方式
  • OpenWRT Conserver 共享串口服务实现
  • Linux UDP 编程详解
  • B3DM转换成XYZ
  • AI面试官
  • 深入HDFS——数据上传源码