一、344反转字符串
第一想法:
看到题第一反应,reverse!哐哐一行搞定☺️嘿嘿
解题思路:
- 还可以用析构函数再循环里前后交换数据
- 用双指针,一个从字符串前面,一个从字符串后面,同时向中间移动交换元素
提交代码:
s.reverse()
// 析构函数
for(let i=0,j=s.length-1;i<j;i++,j--){
//用ES6析构函数交换两个数的位置
[s[i],s[j]]=[s[j],s[i]]
}
//双指针
let left = 0, right = s.length -1
while(left<right){
let r = s[right]
s[right] = s[left]
s[left] = r
left++;
right--
}
二、541反转字符串II
第一想法:
循环每次i移动2k,在循环体内反转前k个字符,分割出来的字符可能小于k,也可能在k和2k之间,要怎么划分出来???
解题思路:
- for循环遍历,用i+=2*k让下标位置每次移动2k,再判断是否有需要反转的区间
- 左边界为i,右边界判断一下i+k-1是否超出了整个长度,如果超出了,那说明最长就是最后一位数,没有超出那就取i到i+k-1的这些字符进行反转
- 然后就是交换字符串的逻辑,随便咋写都行👍🏻
提交代码:
var reverseStr = function(s, k) {
let newS = s.split("")
for(let i = 0;i < s.length; i+=2*k){
let left = i, right = (i+k-1)>=newS.length?newS.length-1:i+k-1
//判断剩余字符,确认有边界下标
while(left<right){
[newS[left],newS[right]]=[newS[right],newS[left]]
left++,right--
}
}
return newS.join('')
};
三、剑指Offer 05.替换空格
第一想法:
这这这,直接用replaceAll,把所有的.替换成空格,一行搞定🤝
提交代码:
//用replace
var pathEncryption = function(path) {
return path.replaceAll('.',' ');
};
四、151.翻转字符串里的单词
第一想法:
只是进行了顺序交换,但是是整体的单词进行位置交换不是字符。或许可以统计有多少个单词(空格),以此判断两两交换的位置?啊啊啊不行,因为有空格+字母的形式,也有字母+空格的形式,而且空格可以连续有好几个,,,,,
或许可以把字符串整体翻转,然后再在内部进行小的翻转!!
解题思路:
难点⚠️在于去除多个空格,因为空格可能出现在前中后任意位置,且数量不定
- 首先把字符串变成数组然后整体进行反转
- 然后使用快慢指针,去掉数组中不必要的空格,只保留字母之间的空格
- 最后翻转单词内部,重写reverse,每当遇到空格时,记录下单词的下标长度,调用reverse翻转当前单词
提交代码:
var reverseWords = function(s) {
let res = Array.from(s).reverse()
//先进行字符串整体翻转
//去除空格
let slow=0
for(let fast = 0;fast<res.length;fast++){
//如果快指针指向的是字符
if(res[fast]!=' '){
//慢指针只有指向第一个的时候不留出空格
if(slow!=0){
res[slow++]=' '
}
while (fast < res.length && res[fast]!=' ') { //补上该单词,遇到空格说明单词结束。
res[slow++] = res[fast++];
}
}
}
let newR = res.splice(0,slow)
let start = 0
//翻转内部字符
for(let j=0;j<=newR.length;j++){
if(newR[j] == ' '|| j==newR.length){
//重写reverse的方法
reverse(newR,start,j-1)
start = j+1
}
}
return newR.join('')
//翻转字符
function reverse(arr, start, end){
let left = start,right = end
while(left<right){
[arr[left], arr[right]] = [arr[right], arr[left]]
left++;
right--;
}
return arr
}
};
五、182 动态口令
第一想法:
拼接字符串,把前target个字符串提取出来,从后拼接到原字符串上
解题思路:
如果不能额外开辟空间。可以模仿上一题,使用整体翻转+局部翻转的方式。先反转区间为前n的子串,然后反转区间为n到末尾的子串,最后反转整个字符串.
提交代码:
//1.0
var dynamicPassword = function(password, target) {
let newp = password.split('')
let newcut = newp.splice(0,target)
return newp.concat(newcut).join('')
};
//2.0
var dynamicPassword = function(password, target) {
let res = password.split('')
reverse(res,0,target-1)
reverse(res,target,res.length-1)
reverse(res,0,res.length-1)
function reverse(arr,start,end){
while(start<end){
[arr[start],arr[end]]=[arr[end],arr[start]]
start++
end--
}
return arr
}
return res.join('')
};
题解资料:代码随想录