day 12 替换空格|反转字符串里的单词||左旋转字符串

力扣

思路

%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--;
    }

}

思路

移除多余空格

将整个字符串反转

将每个单词反转(和上一步差不多)

左旋转字符串

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

最后就可以达到左旋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 解构赋值 进行交换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值