题目:

给你一个小写英文字母组成的字符串 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相关推荐

  1. C练题笔记之:Leetcode-第 85 场双周赛---6156. 得到 K 个黑块的最少涂色次数

    题目: 给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色.字符 'W' 和 'B' 分别表示白色和黑色. 给你一 ...

  2. C练题笔记之:Leetcode-第 85 场双周赛---6157. 二进制字符串重新安排顺序需要的时间

    emm...第一次参加比赛..着实看到了差距之大 题目: 给你一个二进制字符串 s .在一秒之中,所有 子字符串 "01" 同时 被替换成 "10" .这个过程 ...

  3. 以赛促练-力扣第85场双周赛以及第307场周赛

    文章目录 第85场双周赛 T3.字母移位II T4.删除操作后的最大子段和 第307场周赛 T2.最大回文数字 T3.感染二叉树需要的总时间 T4.找出数组的第K大和 第85场双周赛 T1直接暴力枚举 ...

  4. LeetCode第45场双周赛-解题报告

    LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...

  5. Leetcode 第 69 场双周赛记录

    Leetcode 第 69 场双周赛记录 1.第一题 5960. 将标题首字母大写 难度:easy 给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母.请你按以 ...

  6. LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5177. 转变日期格式 easy 2. LeetCode 5445. 子数组和排序后的区间和 medium 3. LeetCode 54 ...

  7. LeetCode 第 31 场双周赛(273/2767,前9.87%,第3次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5456. 在区间范围内统计奇数数目 easy 2. LeetCode 5457. 和为奇数的子数组数目 medium 3. LeetCo ...

  8. Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)

    这套题不算难,但是因为是昨天晚上太晚了,好久没有大晚上写过代码了,有点不适应,今天上午一看还是挺简单的 5177. 转变日期格式 给你一个字符串 date ,它的格式为 Day Month Year ...

  9. 判断单双周java_Java实现LeetCode第31场双周赛(题号5456-5459)

    别人看到题都是,这个题怎么怎么解决, 我看到题--这个题怎么改改可以换成另一道题 嘿嘿嘿

最新文章

  1. UIPopoverController在ARC环境下用法注意
  2. JVM 的 工作原理,层次结构 以及 GC工作原理
  3. XAMPP配置httpd-vhosts.conf后无法启动
  4. 在宝塔环境下安装VUE 及webpack
  5. bzoj3224: Tyvj 1728 普通平衡树(splay)
  6. synchronized 和 volatile 关键字的作用
  7. UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout
  8. ssl1056-金明的预算方案【dp之有依赖的背包】
  9. 三种地理参考信息模型:WMS,WFS,WCS(转)
  10. 可以装linux的路由器,[转载]linux路由器Quagga的配置(一):安装
  11. CSS中z-index
  12. struts2 国际化资源文件自定义的路径解决方法
  13. 20200421:周赛练习题(leetcode148周周赛上)
  14. java某个参数值设置为空_@PathVariable为空时指定默认值的操作
  15. 加载本地文件为String类型
  16. matlab 带通滤波结果不对,带通滤波 matlab
  17. 【行业专题报告】 汽车、二手车-专题资料
  18. 知识库 编号:003
  19. 我的PCB设计经验——奥研电子整理
  20. MSOCache office问题

热门文章

  1. Aloam+deeplabv3+ 构建语义地图+行人车辆检测(kitti数据集)
  2. 《全球NFT数字版权与资产峰会》圆满闭幕——开启NFT应用新未来
  3. 6.[dubbo源码解析]-属性配置
  4. 昆仑万维或将引领国内 AIGC 技术发展
  5. 自适应设计:创建流畅的YouTube和Vimeo内容
  6. SpringBoot+Vue+Element-UI实现人事管理系统
  7. jQuery UI Datepicker日期日历改造为年月日历
  8. 08.数据结构:第一个动态结构-链表
  9. 适合大学生、职场人士提高效率的实用性网站。
  10. CSharp生成二维条码的步骤