C练题笔记之:Leetcode-第 85 场双周赛---6158. 字母移位 II
题目:
给你一个小写英文字母组成的字符串 s
和一个二维整数数组 shifts
,其中 shifts[i] = [starti, endi, directioni]
。对于每个 i
,将 s
中从下标 starti
到下标 endi
(两者都包含)所有字符都进行移位运算,如果 directioni = 1
将字符向后移位,如果 directioni = 0
将字符向前移位。
将一个字符 向后 移位的意思是将这个字符用字母表中 下一个 字母替换(字母表视为环绕的,所以 'z'
变成 'a'
)。类似的,将一个字符 向前 移位的意思是将这个字符用字母表中 前一个 字母替换(字母表是环绕的,所以 'a'
变成 'z'
)。
请你返回对 s
进行所有移位操作以后得到的最终字符串。
示例 1:
输入:s = "abc", shifts = [[0,1,0],[1,2,1],[0,2,1]] 输出:"ace" 解释:首先,将下标从 0 到 1 的字母向前移位,得到 s = "zac" 。 然后,将下标从 1 到 2 的字母向后移位,得到 s = "zbd" 。 最后,将下标从 0 到 2 的字符向后移位,得到 s = "ace" 。
示例 2:
输入:s = "dztz", shifts = [[0,0,0],[1,1,1]] 输出:"catz" 解释:首先,将下标从 0 到 0 的字母向前移位,得到 s = "cztz" 。 最后,将下标从 1 到 1 的字符向后移位,得到 s = "catz" 。
提示:
1 <= s.length, shifts.length <= 5 * 104
shifts[i].length == 3
0 <= starti <= endi < s.length
0 <= directioni <= 1
s
只包含小写英文字母。
结果:
第二种写法优化之后,能通过34个用例。。但是还是超时啊。。。
差分数组法:
可能是因为竞赛题,所有参赛的人用的都是C++...C的过了就是超过100%
解题思路:
emm,没错。。就是超时了。。。可恶的超时!
其实没有思路,就是暴力了。
然后看了下排名靠前的。。发现c++的语法没能看懂。。emmm
emm,发现所有参赛的大佬用的都是C++一开始没看懂,后来看到本题题解提到了差分数组,于是乎恶补了下差分数组的知识,重新做了一遍做出来了。
差分数组笔记
通过笔记中的学习可以得知,我们可以构造一个diff数组记录变化,这样循环shifts的时候无需两层循环。这里录入变化的时候需要注意,本题end是包含在变化里的,所以消除变化的是end往后一格的位置。
最后循环构造出after就可以输出了。
代码:
char * shiftingLetters(char * s, int** shifts, int shiftsSize, int* shiftsColSize){for (int i = 0; i < shiftsSize; i++) {for (int j = shifts[i][0]; j <= shifts[i][1]; j++) {if (shifts[i][2] == 0) {s[j] = s[j] == 'a' ? 'z' : (s[j] - 1);} else {s[j] = s[j] == 'z' ? 'a' : (s[j] + 1);}}}return s;
}
下面这个写法可以多对一个用例。但是仍然超时。
char * shiftingLetters(char * s, int** shifts, int shiftsSize, int* shiftsColSize){int len = strlen(s);int map[len];for (int i = 0; i < len; i++) {map[i] = 0;}for (int i = 0; i < shiftsSize; i++) {for (int j = shifts[i][0]; j <= shifts[i][1]; j++) {if (shifts[i][2] == 0) {//s[j] = s[j] == 'a' ? 'z' : (s[j] - 1);map[j]--;} else {//s[j] = s[j] == 'z' ? 'a' : (s[j] + 1);map[j]++;}}}for (int i = 0; i < len; i++) {s[i] = ((s[i] - 'a' + map[i]) % 26 + 26) % 26 + 'a';}return s;
}
差分数组:
char * shiftingLetters(char * s, int** shifts, int shiftsSize, int* shiftsColSize){int len = strlen(s);// 申请差分数组并构造int *diff = (int *)malloc(sizeof(int) * (len + 1));diff[0] = s[0] - 'a';for (int i = 1; i < len; i++) {diff[i] = s[i] - s[i - 1];}// 将所有差异记录到差分数组for (int i = 0; i < shiftsSize; i++) {int start = shifts[i][0];int end = shifts[i][1] + 1;if (shifts[i][2] == 0) {diff[start] -= 1;diff[end] += 1;} else {diff[start] += 1;diff[end] -= 1;}}// 获取最后的数组char *after = (char *)malloc(sizeof(char) * (len + 1));for(; diff[0] < 0; diff[0] += 26);after[0] = diff[0] % 26 + 'a';for (int i = 1; i < len; i++) {int temp = after[i - 1] - 'a' + diff[i];for (; temp < 0; temp += 26);after[i] = temp % 26 + 'a';}after[len] = '\0';return after;
}
C练题笔记之:Leetcode-第 85 场双周赛---6158. 字母移位 II相关推荐
- C练题笔记之:Leetcode-第 85 场双周赛---6156. 得到 K 个黑块的最少涂色次数
题目: 给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色.字符 'W' 和 'B' 分别表示白色和黑色. 给你一 ...
- C练题笔记之:Leetcode-第 85 场双周赛---6157. 二进制字符串重新安排顺序需要的时间
emm...第一次参加比赛..着实看到了差距之大 题目: 给你一个二进制字符串 s .在一秒之中,所有 子字符串 "01" 同时 被替换成 "10" .这个过程 ...
- 以赛促练-力扣第85场双周赛以及第307场周赛
文章目录 第85场双周赛 T3.字母移位II T4.删除操作后的最大子段和 第307场周赛 T2.最大回文数字 T3.感染二叉树需要的总时间 T4.找出数组的第K大和 第85场双周赛 T1直接暴力枚举 ...
- LeetCode第45场双周赛-解题报告
LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...
- Leetcode 第 69 场双周赛记录
Leetcode 第 69 场双周赛记录 1.第一题 5960. 将标题首字母大写 难度:easy 给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母.请你按以 ...
- LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)
文章目录 1. 比赛结果 2. 题目 1. LeetCode 5177. 转变日期格式 easy 2. LeetCode 5445. 子数组和排序后的区间和 medium 3. LeetCode 54 ...
- LeetCode 第 31 场双周赛(273/2767,前9.87%,第3次全部通过)
文章目录 1. 比赛结果 2. 题目 1. LeetCode 5456. 在区间范围内统计奇数数目 easy 2. LeetCode 5457. 和为奇数的子数组数目 medium 3. LeetCo ...
- Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)
这套题不算难,但是因为是昨天晚上太晚了,好久没有大晚上写过代码了,有点不适应,今天上午一看还是挺简单的 5177. 转变日期格式 给你一个字符串 date ,它的格式为 Day Month Year ...
- 判断单双周java_Java实现LeetCode第31场双周赛(题号5456-5459)
别人看到题都是,这个题怎么怎么解决, 我看到题--这个题怎么改改可以换成另一道题 嘿嘿嘿
最新文章
- UIPopoverController在ARC环境下用法注意
- JVM 的 工作原理,层次结构 以及 GC工作原理
- XAMPP配置httpd-vhosts.conf后无法启动
- 在宝塔环境下安装VUE 及webpack
- bzoj3224: Tyvj 1728 普通平衡树(splay)
- synchronized 和 volatile 关键字的作用
- UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout
- ssl1056-金明的预算方案【dp之有依赖的背包】
- 三种地理参考信息模型:WMS,WFS,WCS(转)
- 可以装linux的路由器,[转载]linux路由器Quagga的配置(一):安装
- CSS中z-index
- struts2 国际化资源文件自定义的路径解决方法
- 20200421:周赛练习题(leetcode148周周赛上)
- java某个参数值设置为空_@PathVariable为空时指定默认值的操作
- 加载本地文件为String类型
- matlab 带通滤波结果不对,带通滤波 matlab
- 【行业专题报告】 汽车、二手车-专题资料
- 知识库 编号:003
- 我的PCB设计经验——奥研电子整理
- MSOCache office问题
热门文章
- Aloam+deeplabv3+ 构建语义地图+行人车辆检测(kitti数据集)
- 《全球NFT数字版权与资产峰会》圆满闭幕——开启NFT应用新未来
- 6.[dubbo源码解析]-属性配置
- 昆仑万维或将引领国内 AIGC 技术发展
- 自适应设计:创建流畅的YouTube和Vimeo内容
- SpringBoot+Vue+Element-UI实现人事管理系统
- jQuery UI Datepicker日期日历改造为年月日历
- 08.数据结构:第一个动态结构-链表
- 适合大学生、职场人士提高效率的实用性网站。
- CSharp生成二维条码的步骤