自学内容网 自学内容网

【刷题10】模拟专题

一、替换所有问号

题目:
在这里插入图片描述

思路:

  • 遍历字符串,找到问号的位置
  • 如果是首字符,只需考虑是否与后一个字符不相等;如果是最后一个字符,只需考虑是否与前一个字符不相等;是中间位置的字符,不能与前后两个字符相同

代码:

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 || s[i-1] != ch) && (i == s.size()-1 || s[i+1] != ch))
                    {
                        s[i] = ch;
                        break;
                    }
                }
            }
        }
        return s;
    }
};

二、提莫攻击

题目:
在这里插入图片描述
思路:

  • 某段时间间隔大于等于中毒持续时间,sum+=d;否则sum+=这段时间间隔
  • 最后一个时间点(数组的最后一个元素)还要加上d

代码:

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

三、Z字形变换

题目:
在这里插入图片描述
思路:
在这里插入图片描述
细节:如果numRows为1,说明只有一行,直接返回原来的字符串

代码:

class Solution {
public:
    string convert(string s, int numRows) {
        int n = s.size();
        if(numRows == 1) return s;
        string ret;
        int d = 2*numRows-2;
        for(int i=0; i<numRows; i++)
        {
            if(i == 0)
            {
                int k = 0;
                while(k*d < n)
                {
                    char ch = s[k*d];
                    ret += ch;
                    k++;
                }
            }
            else if(i == numRows-1)
            {
                int k = 0;
                while(numRows-1+k*d < n)
                {
                    char ch = s[numRows-1+k*d];
                    ret += ch;
                    k++;
                }
            }
            else 
            {
                int k = 0;
                while(i+k*d < n && d-i+k*d < n)
                {
                    char ch = s[i+k*d];
                    ret += ch;
                    char c = s[d-i+k*d];
                    ret += c;
                    k++;
                }
                if(i+k*d < n)
                {
                    char ch = s[i+k*d];
                    ret += ch;
                    k++;
                }
            }
        }
        return ret;
    }
};

四、外观数列

题目:
在这里插入图片描述
思路:

  • 初始化定义的字符串str为"1",如果n等于1就直接返回str
  • 循环次数比n少1,因为前面已经算一次了;定义一个临时的字符串ss,双指针(left right len = 0)
  • 如果right位置等于left位置,right++;否则看right是否等于str的长度,或者right位置不等于left位置,满足其中一个条件,计算len的长度,left到right的位置,ss+=len转换为字符串+right的上一个位置的字符
  • 双指针循环完,更新str;最后次数循环后,返回str

代码:

class Solution {
public:
    string countAndSay(int n) {
        string str = "1";
        if(n == 1) return str;
        while(--n)
        {
            string ss;
            int left = 0, right = 0, len = 0;
            while(right <= str.size())
            {
                if(str[right] == str[left])
                {
                    right++;
                }
                else if(right == str.size() || str[right] != str[left])
                {
                    len = right-left;
                    left = right;
                    ss += to_string(len) + str[right-1];
                }           
            }
            str = ss;
        }
        return str;
    }
};

五、数青蛙

题目:
在这里插入图片描述
思路:

  • 哈希表:hash的每个位置表示次数,index的是每个字符对应下标
  • 如果当前字符是c,看最后一个字符是否在哈希表存在;如果是其他字符,看前一个字符是否在哈希表存在
  • 最后要遍历下hash(次数),除了最后一个字符,其他字符的次数还有不为0的就直接返回-1,否则返回最后一个字符对应的次数

在这里插入图片描述

代码:

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        string str = "croak";
        int n = str.size();
        vector<int> hash(n);// 次数
        unordered_map<char, int> index;// 字符 下标
        for(int i=0; i<n; i++)
        {
            index[str[i]] = i;
        }
        for(auto ch : croakOfFrogs)
        {
            if(ch == 'c')
            {
                if(hash[n-1] == 0)
                {
                    hash[index[ch]]++;
                }
                else
                {
                    hash[n-1]--;
                    hash[index[ch]]++;
                }
            }
            else 
            {
                if(hash[index[ch]-1] == 0)
                {
                    return -1;
                }
                else 
                {
                    hash[index[ch]-1]--;
                    hash[index[ch]]++;
                }
            }
        }
        for(int i=0; i<n-1; i++)
        {
            if(hash[i] != 0) return -1;
        }
        return hash[n-1];
    }
};

原文地址:https://blog.csdn.net/2301_77459845/article/details/142924322

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!