在做题中学习(63):替换问号
解法:模拟
题意:修改问号时,不能和前面一样,不能和后面一样。
所以可以在一个小写字母的循环中通过判断来修改值。
细节
先看一下下面的代码行不行:
for(char a = 'a';a<='z';a++)
{if(a!=s[i-1] && a!=s[i+1]){s[i] = a;break;}}
答案是不行,因为判断时有越界访问情况:
比如示例一:在判断 a!=s[i-1]时,s[i]此时是'?',是首元素在 i == 0下标的位置,s[i-1]就会越界。
而问号在最后 n-1 下标的位置,也会越界,所以需要一起判断。
class Solution
{
public:string modifyString(string s) {int n = s.size();for(int i = 0;i<n;i++){if(s[i] == '?'){for(char a = 'a';a<='z';a++){if((i==0 || a!=s[i-1]) && (i==n-1 || a!=s[i+1])){s[i] = a;break;}}}}return s;}
};
用上 || 是因为如果 '?'在中间,也可以保证逻辑正确。