目录
替换所有的问号
提莫攻击
Z 字形变换
外观数列
数青蛙(较难)
模拟算法:比葫芦画瓢。思路较简单,考察代码能力。
1. 模拟算法流程,一定要在演草纸上过一遍流程
2. 把流程转化为代码
替换所有的问号
1576. 替换所有的问号 - 力扣(LeetCode)
class Solution {public String modifyString(String ss) {char[] s = ss.toCharArray();// 将字符串转化为字符数组int n = s.length;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 String.valueOf(s);}
}
提莫攻击
495. 提莫攻击 - 力扣(LeetCode)
解题思路:看相邻两个元素的差值与中毒时间的大小比较
class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int time = 0;if (duration == 0)return 0;for (int i = 0; i < timeSeries.length - 1; i++) {if (timeSeries[i] + duration < timeSeries[i + 1])time += duration;else {time += timeSeries[i + 1] - timeSeries[i];}}return time += duration;}
}
Z 字形变换
6. Z 字形变换 - 力扣(LeetCode)
①模拟(时间、空间复杂度高)
②找规律(较难)
根据下标进行填入:
class Solution {public String convert(String s, int numRows) {// 处理边界情况:if (numRows == 1)return s;int d = 2 * numRows - 2, n = s.length();// 公差StringBuilder ret = new StringBuilder();// 返回字符串// 先处理第一行for (int i = 0; i < n; i += d) {ret.append(s.charAt(i));}// 再处理中间行for (int k = 1; k < numRows - 1; k++) {// 依次枚举中间行for (int i = k, j = d - i; j < n || i < n; i += d, j += d) {if (i < n)ret.append(s.charAt(i));if (j < n)ret.append(s.charAt(j));}}// 最后处理最后一行for (int i = numRows - 1; i < n; i += d) {ret.append(s.charAt(i));}return ret.toString();}
}
外观数列
38. 外观数列 - 力扣(LeetCode)
解法:模拟+双指针
class Solution {public String countAndSay(int n) {String ret = "1";for (int i = 1; i < n; i++) {// 压缩n-1次StringBuilder tmp = new StringBuilder();int len = ret.length();for (int left = 0, right = 0; right < len;) {while (right < len && ret.charAt(left) == ret.charAt(right))right++;tmp.append(Integer.toString(right - left));tmp.append(ret.charAt(left));left = right;}ret = tmp.toString();}return ret;}
}
数青蛙(较难)
1419. 数青蛙 - 力扣(LeetCode)
解法:模拟+哈希表
r,o,a,k->找前驱字符是否存在于哈希表 ①存在:前驱--,当前字符++②不存在:返回-1
c->找最后一个字符是否存在于哈希表 ①存在:最后字符--,当前字符++②不存在:当前字符++
class Solution {public int minNumberOfFrogs(String c) {char[] croakOfFrogs = c.toCharArray();// 将字符串转化为字符数组String t = "croak";int n = t.length();int[] hash = new int[n];// 数组模拟哈希表Map<Character, Integer> index = new HashMap<>();// [x,x字符对应下标]for (int i = 0; i < n; i++) {index.put(t.charAt(i), i);}for (char ch : croakOfFrogs) {if (ch == t.charAt(0)) {// ch=='c'if (hash[n - 1] != 0) {hash[n - 1]--;}hash[0]++;// 当前字符('c')++} else {int i = index.get(ch);// 当前字符的下标if (hash[i - 1] != 0) {hash[i - 1]--;hash[i]++;} elsereturn -1;}}for (int i = 0; i < n - 1; i++) {if (hash[i] != 0)return -1;}return hash[n - 1];}
}