leetcode1417题为什么通不过?

第一片代码块中是错误的代码,当测试用例为covid2019时,就通不过。

原题题干是:
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。

请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。


错误的代码,其中我规定了odd<n,如果去掉则会报类似内存溢出的错误


class Solution {
public:
    string reformat(string s)
    {
        int n=s.size();
        int alpha=0,digit;//alpha是字母的个数,digit是数字的个数
        int even=0,odd=1;//even代表偶数下标,odd代表奇数下标
        bool f;
        for(auto ch:s)
            if(isalpha(ch))
                alpha++;
        digit=n-alpha;
        if(abs(alpha-digit)>1)
            return {};
        f=alpha>digit? 1:0;
        while(even<n)
        {
            if(isalpha(s[even])!=f)
            {
                while(odd<n&&isalpha(s[odd])!=f)
                {
                    odd+=2;
                }
                swap(s[even],s[odd]);
            }
            even+=2;
        }
        return s;
    }
};

当代码块中按以下方式修改时,则运行正确

       while(even<n)
        {
            if(isdigit(s[even])==f)
            {
                while(isdigit(s[odd])==f)
                {
                    odd+=2;
                }
                swap(s[even],s[odd]);
            }
            even+=2;
        }

除此之外,我还需要解决一个问题,我像下面这样写,系统也能通过

        while(even<n)
        {
            bool t=isalpha(s[even]);
            if(t==f)
            {
                t=isalpha(s[odd]);
                while(t==f)
                {
                    odd+=2;
                    t=isalpha(s[odd]);
                }
                swap(s[even],s[odd]);
            }
            even+=2;
        }

但是一旦我把bool型变量t去掉,换成下面的写法,不论turbo C还是力扣都不能输出正确的答案

        while(even<n)
        {
            if(isalpha(s[even])==f)
            {
                while(isalpha(s[odd])==f)
                {
                    odd+=2;
                }
                swap(s[even],s[odd]);
            }
            even+=2;
        }

把题目发出来好吗

【以下回答由 GPT 生成】

问题出现的原因是在修改条件语句时,没有考虑到原代码中对数字和字母的位置进行交换的逻辑。

在原代码中,

if(isdigit(s[even])==f)

这句条件语句的含义是判断偶数下标位置的字符是数字且与f的值相同,如果满足条件则进行交换。而在这个判断条件之后,接下来的while循环是用来找到一个符合条件的奇数下标位置,然后进行交换。

但当将条件语句修改为if(isalpha(s[even])!=f)时,这句条件的含义变成了判断偶数下标位置的字符是字母且与f的值不同,如果满足条件则进行交换。这里的意思是要找到一个与偶数下标位置的字母类型不同的奇数下标位置进行交换。但实际情况是原代码中是要找到一个与偶数下标位置的数字类型不同的奇数下标位置进行交换。

因此,修改之后的条件语句与原代码的逻辑不一致,导致程序出错。

为了正确修改这个条件语句,可以将条件判断改为判断字符是否为数字,即:

if(isdigit(s[even])==f)

保持原代码的逻辑不变。如果要修改成判断字符是否为字母,需要同时修改交换的逻辑。以下是修改后的代码:

class Solution {
public:
    string reformat(string s) {
        int n=s.size();
        int a=0,d;
        int even=0,odd=1;
        bool f;
        for(auto ch:s)
            if(isalpha(ch))
                a++;
        d=n-a;
        if(abs(a-d)>1)
            return {};
        f=a>d;
        while(even<n)
        {
            if(isdigit(s[even])==f)
            {
                while(isdigit(s[odd])==f)
                {
                    odd+=2;
                }
                swap(s[even],s[odd]);
            }
            even+=2;
        }
        return s;
    }
};

请注意,虽然修改条件语句为判断字符是否为字母,但在原代码中交换的逻辑仍然是将数字和字母进行交换,所以这里没有修改交换的部分代码。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^