「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目:1994. 好子集的数目
给你一个字符串 s ,根据下述规则反转字符串:
所有非英文字母保留在原有位置。 所有英文字母(小写或大写)位置反转。 返回反转后的 s 。
示例 1:
输入:s = "ab-cd" 输出:"dc-ba" 示例 2:
输入:s = "a-bC-dEf-ghIj" 输出:"j-Ih-gfE-dCba" 示例 3:
输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!"
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
在字符串左右两边分别设置指针,遍历字符串; 左指针从左侧遍历,直到碰到第一个单词字符; 右指针从右侧遍历,直到碰到第一个单词字符; 当左右指针停止时,交换指针指向的字符。 left 记录左指针遍历的字符; right 记录右指针遍历的字符;
处理边界 假设s中单词字符为偶数个,那么当 i 与 j 最后一次交换后,会出现以下几种情况 ij中间没有字符: ij指针向中间移动后,i > j; ij中间有非单词字符: 在下一次遍历左指针时,会遍历所有字符,直到 i == j; 假设s中单词字符为奇数个,则在下一次遍历,左指针会指向该字符,右指针也会指向该字符,i == j; 因此,当 i == j 时,我们需要将最后一个字符拼接上
代码实现
/**
* @param {string} s
* @return {string}
*/
var reverseOnlyLetters = function(s) {
// 双指针
let i = 0,j = s.length-1;
let left ='', right = '';
let wCharReg = /[a-zA-Z]/
while(i < j) {
while(i < j) {
if(wCharReg.test(s[i])){
break;
} else {
left += s[i++];
}
}
while(i < j) {
if(wCharReg.test(s[j])){
break;
} else {
right = s[j--] + right;
}
}
if(i < j) {
left += s[j--];
right = s[i++] + right;
}
}
return left + (i == j ? s[i]:'') + right;
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹