网站开发存在的风险,增加网站和接入备案吗,宁波三盛网络网站建设,长春最专业的网站建设题一#xff1a;替换所有的问号 1.链接
1576. 替换所有的问号 - 力扣#xff08;LeetCode#xff09;
2.思路 这道题#xff0c;最重要的就是理解什么是连续重复的字符 连续重复字符是指#xff1a;相同字母连在一起多次出现 先遍历这个数组#xff0c;去找到 #x…题一替换所有的问号 1.链接
1576. 替换所有的问号 - 力扣LeetCode
2.思路 这道题最重要的就是理解什么是连续重复的字符 连续重复字符是指相同字母连在一起多次出现 先遍历这个数组去找到 出现的位置找到后就对该位置进行替换替换的原则是不和左右的字母相同即可当找到了一个符合原则的字母就退出循环完成这个操作后在继续往后面去找出现的位置继续上面操作 边界问题 由于这里会进行对 i -1 和 i 1 位置的访问为了避免出现数组越界访问就单独处理 出现在第一个位置和最后一个位置的情况 3.代码
class Solution {
public:string modifyString(string s) {int n s.size();//当出现在第一个位置if (s[0] ?) {for (int i 0; i 26; i) {if (s[1] ! i a) {s[0] i a;break;}}}//当出现在中间位置for (int i 1; i n; i) {if (s[i] ?) {for (int j 0; j 26; j)if (s[i - 1] ! j a s[i 1] ! j a) {s[i] j a;break;}}}//当出现在最后一个位置if (s[n-1] ? n 2) {for (int i 0; i 26; i) {if (s[n - 2] ! i a) {s[n - 2] i a;break;}}}return s;}
}; 题二提莫攻击 1.链接
495. 提莫攻击 - 力扣LeetCode
2.思路 我们定义一个变量 sum用来累加每次攻击所造成的中毒的时长。问题的关键就是发动攻击后中毒时间该如何去算。此刻我们要将相邻二次攻击的时间差 gap 和中毒持续时间进行比较。当 gap 中毒持续时间,那么就可以完成本次中毒所要时间当 gap 中毒持续时间那么就会发生本次攻击所造成的中毒还没有结束就又开始了一次攻击那么此刻我们去计算本次攻击所造成的中毒时间就等于 gap 本题的关键就是如何去累积算 sum 这里我们要正确确定好每次计算中毒时长的范围。 sum 统计的是因为本次攻击所造成的中毒时长。 3.代码
class Solution {
public:int findPoisonedDuration(vectorint timeSeries, int duration) {int sum 0;for (int i 0; i timeSeries.size() - 1; i) {int gap timeSeries[i 1] - timeSeries[i];if (gap duration)sum duration;elsesum gap;}return sum duration;}
};
题三Z字形变换 1. 链接
6. Z 字形变换 - 力扣LeetCode
2.思路 这里的 Z 字形应该说是 N 字形更好。先从上往下然后在沿对角线方向在不断循环这个操作直到没有字符 我们输出时先输出第一行的并按照从左往右的方向去输出然后就是下一行并也是按照从左往右去输出这样重复操作直到输完最后一行。 我们可以去观察原字符串数组下标与最后输出字符串的下标 行数的关系。 第一行和最后一行下标的关系是同一行相邻二个数据下标之差等于2*numRows - 2 当为中间的行数时以示例二为例子其Z字形的第二行为 A L S I G其中 A 与 L 之间的下标差距为2*行数 - 2 这里的行数是此刻黑色方框所对应的Z字形的行数 L与S之间的下标差为:2 * 当前所处的行数 3.代码
class Solution {
public:string convert(string s, int numRows) {if (numRows 1)return s;string ret;int gap 2 * numRows - 2;for (int i 0; i numRows; i) {int add 2 * i, index i;while (index s.size()) {ret s[index];add gap - add;// 第一次间距是step -2*i第二次是2*i, index (i 0 || i numRows - 1) ? gap : add;}}return ret;}
};
题四 外观数列 1.链接
38. 外观数列 - 力扣LeetCode
2.思路 核心思路模拟双指针操作 3.代码
class Solution {
public:string countAndSay(int n) {string ret 1;for (int i 1; i n; i) //只要进行n-1次操作{int left 0, right 0;string tmp;while (right ret.size()) {while (ret[right] ret[left] right ret.size()) {right;}//出这个循环时就代表此刻right所对应的值和left所对应的值不同tmp to_string(right - left) ret[left];left right;}ret tmp;}return ret;}
};