模拟(5题)
目录1.替换所有的问号2.提莫攻击3.z字形变换4.外观数列5.数青蛙1.替换所有的问号. - 力扣LeetCodeclass Solution { public: string modifyString(string s) { for(int i 0; i s.size();i) { if(s[i] ?) { for(int j a;j z;j) { if(((i 0) ||(s[i-1] ! j)) ((i s.size()-1) || (s[i1] ! j))) { s[i] j; break; } } } } return s; } };2.提莫攻击. - 力扣LeetCodeclass Solution { public: int findPoisonedDuration(vectorint timeSeries, int duration) { int size timeSeries.size(); int ret 0; for(int i 0; i size; i) { if(i size - 1)ret duration; if(i1 size) { if(timeSeries[i1]-timeSeries[i] duration)ret duration; else ret timeSeries[i1]-timeSeries[i]; } } return ret; } };3.z字形变换. - 力扣LeetCodeclass Solution { public: string convert(string s, int numRows) { if(numRows 1)return s; string ret; int n s.size(); int gap 2 * numRows - 2; for(int i 0; i numRows; i) { if((i 0) || (i numRows - 1)) { for(int j i; j n; j gap) { ret s[j]; } } else { int x i, y gap - x; while(y n) { ret s[x]; ret s[y]; x gap; y gap; } if(x n)ret s[x]; } } return ret; } };我们可以依照题目所说先把字符填到二维数组中但是我们可以直接寻找规律然后做题。由图我们可以得出第一行和最后一行的规律相同中间的几行的规律相同第一行和最后一行的起始位置分别是和numRows - 1他们每个的间隔是2 * numRows - 2。中间行数每行的初始有两个位置以黑三角与白圆圈表示两个位置的下标之和为2 * numRows - 2而两个位置到下一位置也均为加上2 * numRows - 2。最后值得注意的是若numRows为1循环会陷入死循环因此我们先要判读一下这种情况4.外观数列. - 力扣LeetCodeclass Solution { public: string countAndSay(int n) { string s 1; for(int i 1 ; i n; i) { string news; int size s.size(); for(int left 0, right 0; right size ;) { while(s[right] s[left] right size)right; news to_string(right - left); news s[left]; left right; } s news; } return s; } };本质上是一道滑动窗口的题目我们只需要循环这个过程即可5.数青蛙. - 力扣LeetCodeclass Solution { public: int minNumberOfFrogs(string croakOfFrogs) { int hash[128]; int size croakOfFrogs.size(); for(int i 0; i size; i) { if(croakOfFrogs[i] c) { if(hash[k]) { hash[k]--; hash[c]; } else { 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; } } if(hash[c] || hash[r] || hash[o] || hash[a])return -1; return hash[k]; } };这题我们建立一个哈希表用数组简单代替即可。根据题意我们从c开始记录青蛙的叫声。当我们遇到roak时要去查询前一个字母是否有青蛙已经叫了如果有将前一个字母对应的值减一将这个字母对应的值加一如果没有那么这个字符串即为非法。题目要求最少那么我们在记录c时应该先查看k字母对应的值如果大于零说明已经有青蛙叫完一次了那么我们将k对应的值减一然后再将c对应的值加一。最后当结束循环时我们要保证croa这几处对应的值均为0否则即为非法。我们只需要返回k对应的值即可。