【每日刷题】Day138
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 6. Z 字形变换 - 力扣(LeetCode)
2. 38. 外观数列 - 力扣(LeetCode)
3. 1419. 数青蛙 - 力扣(LeetCode)
1. 6. Z 字形变换 - 力扣(LeetCode)
//思路:模拟。
//按照题目的要求照葫芦画瓢将Z字形矩阵模拟出来即可。
//模拟出矩阵后直接遍历矩阵存储非 '\0' 元素。
class Solution {
public:
string convert(string s, int numRows)
{
string ans;
vector<vector<char>> mock(numRows,vector<char>(s.size()));
int sub = 0,j = 0;// j 代表列号;sub用来遍历字符串 s
while(sub<s.size())
{
int i = 0;
while(sub<s.size()&&i<numRows)//竖直向下模拟存储,i++,j不动
{
mock[i][j] = s[sub++];
i++;
}
i--;// i-- 回到矩阵中
while(sub<s.size()&&--i>0) mock[i][++j] = s[sub++];//这里 i 先 -- ,因为最后一行在我们竖直向下的模拟过程中已经存储了;同样的,--i > 0 因为我们在竖直向下模拟的过程中 0 位置也已经存储了
j++;// j++ 进入下一列
}
for(int i = 0;i<numRows;i++)
{
for(int j = 0;j<s.size();j++)
{
if(mock[i][j]!='\0')
ans.push_back(mock[i][j]);//遍历模拟矩阵
}
}
return ans;
}
};
2. 38. 外观数列 - 力扣(LeetCode)
//思路:双指针+模拟。
//本题难点仅在于 行程长度编码 的理解。只要理解清楚了本题的模拟思路就非常容易想了。
//模拟过程:使用双指针 left 和 right 遍历当前需要编码的字符串,right初始为1,left初始为0。当 right 和 left 指向的字符不同时,right - left 就是 left 指向字符的个数,记录。
class Solution {
public:
string countAndSay(int n)
{
vector<string> mock;
mock.push_back("1");
string tmp = "1";
for(int i = 0;i<n;i++)
{
string arr;
int left = 0,right = 1;
while(right<tmp.size())
{
while(right<tmp.size()&&tmp[right]==tmp[left]) right++;//找到第一个与 left 不同的字符
arr.push_back(right-left+'0');//记录 left 字符出现的次数
arr.push_back(tmp[left]);//再记录 left 字符
left = right;
right++;
}
if(left<tmp.size())//当 right 越界后,如果 left 还未越界,说明 left 还未记录
{
arr.push_back(right-left+'0');
arr.push_back(tmp[left]);
}
tmp = arr;
mock.push_back(arr);
}
return mock[n-1];
}
};
3. 1419. 数青蛙 - 力扣(LeetCode)
//思路:哈希+模拟。
//本题的模拟思路还是比较不好想的,直接来看图
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs)
{
int hash[128] = {0};
for(int i = 0;i<croakOfFrogs.size();i++)
{
if(croakOfFrogs[i]=='c')
{
if(hash['k']) hash['k']--;//判断是否有青蛙鸣叫完了,让鸣叫完了的青蛙继续鸣叫
hash['c']++;
}
//下面都是去判断是否有青蛙鸣叫到了前一个字符
else if(croakOfFrogs[i]=='r')
{
if(hash['c'])
{
hash['c']--;
hash['r']++;
}
else return -1;
}
else if(croakOfFrogs[i]=='o')
{
if(hash['r'])
{
hash['r']--;
hash['o']++;
}
else return -1;
}
else if(croakOfFrogs[i]=='a')
{
if(hash['o'])
{
hash['o']--;
hash['a']++;
}
else return -1;
}
else
{
if(hash['a'])
{
hash['a']--;
hash['k']++;
}
else return -1;
}
}
for(int i = 97;i<107;i++)//最后还需要判断是否有青蛙未能完成鸣叫
if(hash[i]) return -1;
return hash['k'];//最终 'k' 位置的值就是有多少只青蛙完成了鸣叫
}
};