模拟(5题)

目录

1.替换所有的问号

2.提莫攻击

3.z字形变换 

4.外观数列

5.数青蛙


1.替换所有的问号

. - 力扣(LeetCode)

class Solution {
public:
    string modifyString(string s) {
        for(int i = 0; i < s.size();i++)
        {
            if(s[i] == '?')
            {
                for(int j = 'a';j <= 'z';j++)
                {
                    if(((i == 0) ||(s[i-1] != j)) && ((i == s.size()-1) || (s[i+1] != j)))
                    {
                        s[i] = j;
                        break;
                    }
                }
            }
        }
        return s;
    }
};

2.提莫攻击

. - 力扣(LeetCode)

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int size = timeSeries.size();
        int ret = 0;
        for(int i = 0; i < size; i++)
        {
            if(i == size - 1)ret += duration;
            if(i+1 < size)
            {
                if(timeSeries[i+1]-timeSeries[i] > duration)ret += duration;
                else ret += timeSeries[i+1]-timeSeries[i];
            }
        }
        return ret;
    }
};

3.z字形变换 

. - 力扣(LeetCode)

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1)return s;
        string ret;
        int n = s.size();
        int gap = 2 * numRows - 2;
        for(int i = 0; i < numRows; i++)
        {
            if((i == 0) || (i == numRows - 1))
            {
                for(int j = i; j < n; j += gap)
                {
                    ret += s[j];
                }
            }
            else
            {
                int x = i, y = gap - x;
                while(y < n)
                {
                    ret += s[x];
                    ret += s[y];
                    x += gap;
                    y += gap;
                }
                if(x < n)ret += s[x];
            }
        }
        return ret;
    }
};

        我们可以依照题目所说先把字符填到二维数组中,但是我们可以直接寻找规律,然后做题。 

        

        由图我们可以得出,第一行和最后一行的规律相同,中间的几行的规律相同,

        第一行和最后一行的起始位置分别是和numRows - 1;他们每个的间隔是2 * numRows - 2。

        中间行数每行的初始有两个位置以黑三角与白圆圈表示,两个位置的下标之和为2 * numRows - 2;而两个位置到下一位置也均为加上2 * numRows - 2。

        最后值得注意的是,若numRows为1,循环会陷入死循环,因此我们先要判读一下这种情况

4.外观数列

. - 力扣(LeetCode)

class Solution {
public:
    string countAndSay(int n) {
        string s = "1";
        for(int i = 1 ; i < n; i++)
        {
            string news;
            int size = s.size();
            for(int left = 0, right = 0; right <size ;)
            {
                
                while(s[right] == s[left] && right < size)right++;
                news += to_string(right - left);
                news += s[left];
                left = right;
            }
            s = news;
        }
       return s;
    }
};

        本质上是一道滑动窗口的题目,我们只需要循环这个过程即可

5.数青蛙

. - 力扣(LeetCode)

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        int hash[128];
        int size = croakOfFrogs.size();
        for(int i = 0; i < size; i++)
        {
            if(croakOfFrogs[i] == 'c')
            {
                if(hash['k'])
                {
                    hash['k']--;
                    hash['c']++;
                }
                else
                {
                    hash['c']++;
                }
            }
            else if(croakOfFrogs[i] == 'r')
            {
                if(hash['c'])
                {
                    hash['c']--;
                    hash['r']++;
                }
                else return -1;
            }
            else if(croakOfFrogs[i] == 'o')
            {
                if(hash['r'])
                {
                    hash['r']--;
                    hash['o']++;
                }
                else return -1;
            }
            else if(croakOfFrogs[i] == 'a')
            {
                if(hash['o'])
                {
                    hash['o']--;
                    hash['a']++;
                }
                else return -1;
            }
            else
            {
                if(hash['a'])
                {
                    hash['a']--;
                    hash['k']++;
                }
                else return -1;
            }
        }
        if(hash['c'] || hash['r'] || hash['o'] || hash['a'])return -1;
        return hash['k'];
    }
};

        这题我们建立一个哈希表,用数组简单代替即可。

        根据题意,我们从c开始记录青蛙的叫声。

        当我们遇到r,o,a,k时,要去查询前一个字母是否有青蛙已经叫了,如果有,将前一个字母对应的值减一,将这个字母对应的值加一,如果没有,那么这个字符串即为非法。

        题目要求最少,那么我们在记录c时,应该先查看k字母对应的值,如果大于零,说明已经有青蛙叫完一次了,那么我们将k对应的值减一,然后再将c对应的值加一。

        最后当结束循环时,我们要保证croa这几处对应的值均为0,否则即为非法。

        我们只需要返回k对应的值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值