模拟算法的应用
方法:
1、模拟一下算法流程
2、进而将流程转换成代码
第一题:
代码:
class Solution {
public:
string modifyString(string s) {
int len = s.size();
for (int i = 0; i < len; i++) {
if (s[i] == '?') {
for (char ch = 'a'; ch <='z'; ch++) {
if ((i == 0 || s[i - 1] != ch) &&
(i == len - 1 || s[i + 1] != ch)) {
s[i] = ch;
break;
}
}
}
}
return s;
}
};
第二题:
算法思路:
1、求两个时间点的差值;
2、当差值大于等于duration,时间就加满整个duration;
3、 差值小于duration,时间就只能加上差值;
4、最后一个时间点,无论如何都要加满整个duration;
代码:
class Solution {
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration) {
int ret = 0;
for(size_t i = 1;i<timeSeries.size();i++){
int tem = timeSeries[i]-timeSeries[i-1];
if(tem >=duration) ret+=duration;
else ret += tem;
}
ret+= duration;
return ret;
}
};
第三题:
解题思路:
代码:
class Solution {
public:
string convert(string s, int numRows) {
// 处理特殊的情况;
if (numRows == 1)
return s;
// 正常的情况
int n = s.size();
// 公差
int d = 2 * numRows - 2;
string ret;
// 第一行
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;
}
};
第四题:
代码:
class Solution {
public:
string countAndSay(int n) {
string s = "1"; // 设置一个最开始的string,并且最后要返回这个string
for (int i = 1; i < n; i++) {
string tem; // 定义一个临时的string,反复将此覆盖给上面的string s
int len = s.size();
// 双指针方法
for (int left = 0, right = 0; left < len && right < len;) {
while (right < len && s[right] == s[left])
right++;
tem += to_string(right - left) + s[left];
left = right;
}
// 更新给开始的string s
s = tem;
}
// 最后返回这个string s
return s;
}
};