第一片代码块中是错误的代码,当测试用例为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;
}