模拟算法题我们只需要按照题目的意思一步一步走,将这些步骤转换成代码即可
1.替换所有问号
题目要求将字符串中所有的问号都改为其他字母,但是要求不能与左右两边的字母重复,返回一种结果即可。
解法:
遍历原字符串,当遍历到问号时,我们遍历26个英文字母,找到既不与前面相同也不与后面相同的字母,修改该位置,继续遍历。在遍历的过程中需要注意首元素以及尾元素,它们只需要判断相邻的一个元素即可,要避免越界访问。
处理办法:
1、得知当前位置的元素是问号后,我们可以接着三目运算符求出左右字符,如果那一侧不存在,则随便给一个字符,但不可以是字母,其不影响结果
2、已知i位置当前字符是问号,在遍历26个英文字母时进行额外判断,如果i == 0,则没有左侧元素,如果i = n-1,则没有右侧元素.if (i == 0 || prev != ch) && (i == n-1 || next != ch )
时间复杂度:O(26n),遍历数组一遍,期间还遍历了26个英文字母
空间复杂度:O(1),没有使用额外的空间
// C++
class Solution
{
public:
string modifyString(string s)
{
for(int i=0; i<s.size(); ++i)
{
if(s[i] == '?')
{
char tmp1 = i-1<0?'0':s[i-1];
char tmp2 = i+1>s.size()-1?'0':s[i+1];
for(char ch='a'; ch<='z'; ++ch)
{
if(ch != tmp1 && ch != tmp2)
{
s[i] = ch;
}
}
}
}
return s;
}
};
# python
class Solution:
def modifyString(self, s: str) -> str:
tmp = list(s)
for i in range(0,len(tmp)):
if tmp[i] == '?':
for ch in range(ord('a'),ord('z')+1):
j = chr(ch)
if (i==0 or tmp[i-1]!=j) and (i==len(tmp)-1 or tmp[i+1]!=j):
tmp[i] = j
break
return ''.join(tmp)
2.提莫攻击
题目给我们一个timeSeries数组,里面存放的是提莫普攻的时间。提莫每普攻一次,就会使敌人中毒duration秒,如果在中毒结束之前又普攻了一次,此时就会重置中毒时间。我们需要返回总的中毒时间。
解法:
遍历数组,当遍历到一个时间后,我们给其加上中毒时间,如果该时间小于等于下一次普攻的时间,就不会重置中毒,此时只需要在总中毒时间上加上duration即可;如果大于中毒时间,则说明中毒还未结束,就又普攻了,需要重置中毒时间,此时中毒的时长就是两次普攻之间的间隔时间。
需要注意最后一次普攻,最后一次普攻一定会经历一次完整的中毒。所以加上duration。
时间复杂度:O(n),遍历数组一次
空间复杂度:O(1),没有使用额外的空间