思路
%20 字符串 要占三个位置 替换空格 得额外增加2个位置
JS中 先把字符串转换成数组
定义两个指针
left 指向 数组原长度的尾部 right 指向新数组的尾部
对原数组进行遍历
出现空格
array[right]='0'
array[right]='2'
array[right]='%'
right-=2
还得再-1 因为一次循环
/**
* @param {string} s
* @return {string}
*/
var replaceSpace = function(s) {
// let i=0;
// for(i=0;i<s.length;i++)
// {
// if(s[i]===' ')
// {
// s[i]='%20'//%20占3个位置!!
// }
// }
// return s
// js里面么有字符串吗
const array = s.split('')
let count = 0
for(let i=0;i<array.length;i++){
if(array[i]===' ')
count++
}
let left = array.length-1
let right = array.length-1+2*count//因为‘ ’也提供了一个位置 所以*2就行
for(i=left;i>=0;i--){
if(array[i]==' '){
array[right]='0'
array[right-1]='2'
array[right-2]='%'
right=right-3//-2-1 为啥还要-1 因为 这一轮过去了 right得前移一个位置
}else{
array[right]=array[i]
right--
// left--
}
}
// for(let i=left,j=right;j>i;i--,j--)
return array.join('')
};
js有字符串
问题
%20 字符串 要占三个位置 替换空格 得额外增加2个位置 而不是只占一个位置!!
字符串转字符串数组 方便运算
反转字符串中的单词
移除空格 有点问题
已经理解
// 移除末尾空格 slowIndex-1 为长度 不是下标!!!
strArr.length = strArr[slowIndex-1]===' '?slowIndex-1:slowIndex
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
const strArr = Array.from(s)
// 移除多余空格
removeExtraSpaces(strArr)
// 翻转
reverse(strArr,0,strArr.length-1)
let start = 0;
for(let i=0;i<=strArr.length;i++){
if(strArr[i]===' '||i===strArr.length){
// 翻转单词
reverse(strArr,start,i-1);
start=i+1
}
}
return strArr.join('')
};
// 删除多余空格
function removeExtraSpaces(strArr){
let slowIndex = 0
let fastIndex = 0
while(fastIndex<strArr.length){
// 移除开始位置和重复的空格
if(strArr[fastIndex]===' '&&(fastIndex===0||strArr[fastIndex-1]===' ')){
fastIndex++
}else{
strArr[slowIndex++]=strArr[fastIndex++]
}
}// 移除末尾空格 slowIndex-1 为长度 不是下标!!!
strArr.length = strArr[slowIndex-1]===' '?slowIndex-1:slowIndex
}
// 翻转 从 start 到end的字符
function reverse(strArr,start,end){
let left = start;
let right = end;
while(left<right){
[strArr[left],strArr[right]]=[strArr[right],strArr[left]];
left++;
right--;
}
}
思路
移除多余空格
将整个字符串反转
将每个单词反转(和上一步差不多)
左旋转字符串
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
最后就可以达到左旋n的目的,而不用定义新的字符串,完全在本串上操作。
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function(s, n) {
const s1 =s.split('')// 得把字符串 转换成数组 不然不能用字符串解构 交换
reverse(s1,0,n-1)
reverse(s1,n,s1.length-1)
reverse(s1,0,s1.length-1)
return s1.join('')
};
function reverse(s,start,end){
let left = start,right=end
while(left<right){
[s[left],s[right]]=[s[right],s[left]]
left++;
right--;
}
}
问题
注意 得把字符串 转换成 字符串数组 不然没用。 不能用es6 解构赋值 进行交换