模拟
目录
试题1:替换所有的问号

算法原理
解法:模拟
照葫芦画瓢,思路简单,考察代码能力
模拟算法流程,在草稿纸上过流程,将流程转化为代码

代码编写
- 个人版本
cpp
class Solution
{
public:
string modifyString(string s)
{
int n = s.size();
for(int i = 0;i < n;i++)
{
if(s[i] == '?')
{
if(i == 0)
{
if(s[i + 1] != 'a')
{
s[i] = 'a';
}
else
{
s[i] = 'b';
}
}
else if(i == n - 1)
{
if(s[i - 1] != 'a')
{
s[i] = 'a';
}
else
{
s[i] = 'b';
}
}
else
{
if(s[i - 1] != 'a' && s[i + 1] != 'a')
{
s[i] = 'a';
}
else if(s[i - 1] == 'a' || s[i + 1] == 'a')
{
if(s[i - 1] != 'b' && s[i + 1] != 'b')
{
s[i] = 'b';
}
else if(s[i - 1] == 'b' || s[i + 1] == 'b')
{
if(s[i - 1] != 'c' && s[i + 1] != 'c')
{
s[i] = 'c';
}
}
}
}
}
}
return s;
}
};
- 标准版本
cpp
class Solution
{
public:
string modifyString(string s)
{
int n = s.size();
for(int i = 0;i < n;i++)
{
if(s[i] == '?')//替换
{
for(char ch = 'a';ch <= 'z';ch++)
{
if((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1]))
{
s[i] = ch;
break;
}
}
}
}
return s;
}
};
试题2:提莫攻击

算法原理

代码编写
- 个人版本
cpp
class Solution
{
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration)
{
int n = timeSeries.size();
int ret = 0;
for(int i = 1;i < n;i++)
{
if(timeSeries[i] - timeSeries[i - 1] >= duration)
{
ret += duration;
}
else
{
ret += timeSeries[i] - timeSeries[i - 1];
}
}
ret += duration;
return ret;
}
};
- 标准版本
cpp
class Solution
{
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration)
{
int ret = 0;
for(int i = 1;i < timeSeries.size();i++)
{
int x = timeSeries[i] - timeSeries[i - 1];
if(x >= duration) ret += duration;
else ret += x;
}
return ret += duration;
}
};
试题3:Z字形变换

算法原理

解法一:模拟
时间复杂度:O(len * N)
空间复杂度:O(len * N)

解法二:找规律优化

代码编写
- 个人版本
cpp
class Solution
{
public:
string convert(string s, int numRows)
{
if(numRows == 1)
{
return s;
}
int d = numRows * 2 - 2;
string ret;
for(int row = 0; row < numRows; row++)
{
if(row == 0)
{
for(int len = 0; len < s.size(); len += d)
{
ret += s[len];
}
}
else if(row == numRows - 1)
{
for(int len = numRows - 1; len < s.size(); len += d)
{
ret += s[len];
}
}
else
{
for(int len = row; len < s.size(); len += d)
{
ret += s[len];
int tmp = d + len - 2 * row;
if(tmp < s.size())
{
ret += s[tmp];
}
}
}
}
return ret;
}
};
- 标准版本
cpp
class Solution
{
public:
string convert(string s, int numRows)
{
//处理边界情况
if(numRows == 1) return s;
string ret;
int d = 2 * numRows - 2, n = s.size();
//#1:先处理第一行
for(int i = 0; i < n; i += d)
ret += s[i];
//#2:处理中间行
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];
}
}
//#3:处理最后一行
for(int i = numRows - 1; i < n; i += d)
ret += s[i];
return ret;
}
};
试题4:外观数列

算法原理

解法:模拟+双指针

代码编写
- 个人版本
cpp
class Solution
{
public:
string countAndSay(int n)
{
string prev = "1";
for(int i = 0;i < n - 1;i++)
{
string cur;
int right = 0,left = 0;
while(right < prev.size())
{
while(prev[right] == prev[left])
{
right++;
}
cur += to_string(right - left);
cur += prev[left];
left = right;
}
prev = cur;
}
return prev;
}
};
- 标准版本
cpp
class Solution
{
public:
string countAndSay(int n)
{
string ret = "1";
for(int i = 1; i < n; i++)
{
string tmp;
int len = ret.size();
for(int left = 0,right = 0;right < len;)
{
while(right < len && ret[left] == ret[right]) right++;
tmp += to_string(right - left) + ret[left];
left = right;
}
ret = tmp;
}
return ret;
}
};
试题5:数青蛙

算法原理
解法:模拟

代码编写
- 个人版本
cpp
class Solution
{
public:
int minNumberOfFrogs(string croakOfFrogs)
{
unordered_map<char,int> hash = {
{'c',0},
{'r',1},
{'o',2},
{'a',3},
{'k',4},
};
int hash_arr[5] = {0};
int n = croakOfFrogs.size();
if(n % 5 != 0)
{
return -1;
}
for(int i = 0;i < n;i++)
{
if(hash[croakOfFrogs[i]] == 0)//'c'
{
if(hash_arr[4] > 0)
{
hash_arr[4]--;
hash_arr[0]++;
}
else
{
hash_arr[0]++;
}
}
else//其他字符
{
if(hash_arr[hash[croakOfFrogs[i]] - 1] > 0)
{
hash_arr[hash[croakOfFrogs[i]] - 1]--;
hash_arr[hash[croakOfFrogs[i]]]++;
}
else
{
return -1;
}
}
}
if(hash_arr[0] || hash_arr[1] || hash_arr[2] || hash_arr[3])
{
return -1;
}
return hash_arr[4];
}
};
- 标准版本
cpp
class Solution
{
public:
int minNumberOfFrogs(string croakOfFrogs)
{
string t = "croak";
int n = t.size();
vector<int> hash(n);//用数组模拟哈希表
unordered_map<char,int> index;//[x,x这个字符对应下标]
for(int i = 0;i < n;i++)
{
index[t[i]] = i;
}
for(auto ch : croakOfFrogs)
{
if(ch == 'c')
{
if(hash[n - 1] != 0) hash[n - 1]--;
hash[0]++;
}
else
{
int i = index[ch];
if(hash[i - 1] == 0) return -1;
hash[i - 1]--;hash[i]++;
}
}
for(int i = 0;i < n - 1;i++)
if(hash[i] != 0)
return -1;
return hash[n - 1];
}
};