自学内容网 自学内容网

模拟练习题

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

替换所有的问号

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];
}


原文地址:https://blog.csdn.net/Frenemy__/article/details/145233468

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