【C++刷题】优选算法——模拟

  1. 替换所有的问号
string modifyString(string s)
{
    if (s.size() == 1)
    {
        if (s[0] != '?') return s;
        else return "a";
    }

    for (int i = 0; i < s.size(); ++i)
    {
        if (s[i] == '?') // 遇到'?'
        {
            if (i != 0) // '?' 不在 0 位置 说明左边有字母
            {
                if (i + 1 < s.size()) // 说明右边有元素
                {
                    for (int c = 'a'; c <= 'z'; ++c)
                    {
                        if (s[i - 1] != c && s[i + 1] != c)
                        {
                            s[i] = c;
                            break;
                        }
                    }
                }
                else // 右边没有元素
                {
                    for (int c = 'a'; c <= 'z'; ++c)
                    {
                        if (s[i - 1] != c)
                        {
                            s[i] = c;
                            break;
                        }
                    }
                }
            }
            else // '?' 在 0 位置 (此时右边肯定有元素)
            {
                if (s[i + 1] != '?') // 右边元素是字母
                {
                    for (int c = 'a'; c <= 'z'; ++c)
                    {
                        if (s[i + 1] != c)
                        {
                            s[i] = c;
                            break;
                        }
                    }
                }
                else // 右边元素是'?'
                {
                    s[i] = 'a';
                }
            }
        }
    }
    return s;
}
  1. 提莫攻击
int findPoisonedDuration(vector<int>& timeSeries, int duration)
{
    int time = 0;
    int start = timeSeries[0], end = start + duration - 1; // [start, end]
    for(int i = 1; i < timeSeries.size(); ++i)
    {
        if(timeSeries[i] <= end)
        {
            end = timeSeries[i] + duration - 1;
        }
        else
        {
            time += end - start + 1;
            start = timeSeries[i];
            end = start + duration - 1;
        }
    }
    time += end - start + 1;
    return time;
}

int findPoisonedDuration(vector<int>& timeSeries, int duration)
{
    int time = 0;
    for(int i = 1; i < timeSeries.size(); ++i)
    {
        int interval = timeSeries[i] - timeSeries[i-1];
        if(interval >= duration) time += duration;
        else time += interval;
    }
    return time + duration;
}
  1. Z 字形变换
// tips:当发现一个模拟策略复杂度太高,大多数情况下都是在模拟中找规律来进行优化
string convert(string s, int numRows)
{
    if(s.size() <= numRows || numRows == 1) return s;

    string ret;
    int interval = 2 * numRows - 2; // 公差间隔
    for(int i = 0; i < s.size(); i += interval) ret += s[i];
    for(int i = 1; i < numRows - 1; ++i)
    {
        for(int left = i, right = interval - left; left < s.size() || right < s.size(); left += interval, right += interval)
        {
            if(left < s.size()) ret += s[left];
            if(right < s.size()) ret += s[right];
        }
    }
    for(int i = numRows - 1; i < s.size(); i += interval) ret += s[i];
    return ret;
}
  1. 外观数列
string RLE(const string& str)
{
    string ret;
    int start = 0, end = start + 1;
    for( ; end < str.size(); ++end)
    {
        if(str[end] != str[start])
        {
            ret += to_string(end - start);
            ret += str[start];
            start = end;
        }            
    }
    ret += to_string(end - start);
    ret += str[start];
    return ret;
}
// 递归
string countAndSay(int n)
{
    if(n == 1) return "1";

    return RLE(countAndSay(n-1));
}
// 迭代
string countAndSay(int n)
{
    string ret = "1";
    for(int i = 2; i <= n; ++i)
    {
        ret = RLE(ret);
    }
    return ret;
}
  1. 数青蛙
int minNumberOfFrogs(string croakOfFrogs)
{
    unordered_map<char, int> hash = {
        {'c', 0},
        {'r', 1},
        {'o', 2},
        {'a', 3},
        {'k', 4}
    };
    vector<int> v(5);
    for(char ch : croakOfFrogs)
    {
        if(ch != 'c')
        {
            if( v[ hash[ch] - 1 ] != 0 )
            {
                v[hash[ch]]++;
                v[hash[ch] - 1]--;
            }
            else return -1;
        }
        else // ch == 'c'
        {
            if( v[hash['k']] > 0 ) v[hash['k']]--;
            v[hash['c']]++;
        }
    }
    for(int i = 0; i < v.size() - 1; ++i)
    {
        if(v[i] != 0) return -1;
    }
    return v[hash['k']];
}

相关推荐

  1. C++优选算法——模拟

    2024-06-06 03:10:02       9 阅读
  2. C++优选算法——前缀和

    2024-06-06 03:10:02       7 阅读
  3. C++优选算法——位运算

    2024-06-06 03:10:02       8 阅读
  4. C++优选算法——动态规划第四辑

    2024-06-06 03:10:02       16 阅读
  5. C++优选算法——动态规划第五辑

    2024-06-06 03:10:02       14 阅读
  6. C++优选算法——动态规划第六辑

    2024-06-06 03:10:02       12 阅读
  7. C++优选算法——递归第一辑

    2024-06-06 03:10:02       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 03:10:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 03:10:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 03:10:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 03:10:02       20 阅读

热门阅读

  1. ehcache3多级缓存应用

    2024-06-06 03:10:02       8 阅读
  2. Pytorch实用教程:pytorch中 argmax(dim)用法详解

    2024-06-06 03:10:02       9 阅读
  3. MySQL——索引

    2024-06-06 03:10:02       8 阅读
  4. 【Android】PopupWindow焦点控制方式解析

    2024-06-06 03:10:02       11 阅读
  5. MySQL之数据库事务机制学习笔记(五)

    2024-06-06 03:10:02       9 阅读
  6. GPT-4o:突破与革新

    2024-06-06 03:10:02       8 阅读
  7. 如何评价GPT-4o?

    2024-06-06 03:10:02       9 阅读
  8. 如何评价GPT-4o?

    2024-06-06 03:10:02       11 阅读
  9. uniapp uni.showModal 出现点击没有反应

    2024-06-06 03:10:02       9 阅读
  10. 语音控制系统的安全挑战与防御策略(下)

    2024-06-06 03:10:02       8 阅读
  11. VRRP

    VRRP

    2024-06-06 03:10:02      6 阅读
  12. 安卓Launcher启动详解

    2024-06-06 03:10:02       8 阅读