LeetCode刷题日记之字符串I

1.反转字符串

题目描述

在这里插入图片描述

解题思路

1.使用双指针,left表示字符串起点,right表示字符串终点
2.交换左右指针的值,左指针递增,右指针递减
3.循环结束条件left < right

var reverseString = function(s) {
    let  left = 0;
    let right = s.length - 1
    while(left < right) {
       [s[right],s[left]] = [s[left],s[right]]
       left++;
       right --
    }

    return s
};

2.反转字符串II

题目描述

在这里插入图片描述

解题思路

1.本题解题思路和反转字符串相同,只需在外面再套一层for循环,使i+=2*k
2.需要注意的是本题给的是字符串,不是数组,需要将字符串分成数组再操作。

var reverseStr = function(s, k) {
    const len = s.length;
    let resArr = s.split(""); 
    for(let i = 0; i < len; i += 2 * k) {  // 每隔 2k 个字符的前 k 个字符进行反转
        let l = i - 1, r = i + k > len ? len : i + k;
        while(++l < --r) [resArr[l], resArr[r]] = [resArr[r], resArr[l]];
    }
    return resArr.join("");
};

3.替换字符串中的空格

题目描述

在这里插入图片描述

解题思路

1.本题最简单的思路就是循环遍历,遇到空格就替换成%20
2.还有就是先统计字符串中空格的数量,再将字符串扩容
3.使用双指针,一个指针指向扩容后的位置,一个指向扩容前的位置
4.将扩容前的值赋值给扩容后的值,遇到空格直接连赋值3个字符 ‘%’ ‘2’ '0,需要从后往前遍历

var replaceSpace = function(s) {
     s = s.split('')
  let count = 0;
  for (let i = 0; i < s.length; i++) {
    if (s[i] === " ") {
      count++;
    }
  }
  const oldLength = s.length;
  s.length = oldLength + count*2
  const newLength = s.length;
  for (let i = oldLength - 1, j = newLength - 1; i < j; i--, j--) {
    if (s[i] !== " ") {
      s[j] = s[i];
    } else {
      s[j] = "0";
      s[j - 1] = "2";
      s[j - 2] = "%";
      j = j - 2;
    }
  }
  return s.join('');
};

4.翻转字符串里的单词

题目描述

在这里插入图片描述

解题思路

1.本题直接在原字符串上操作。
2.移除字符串前后多余空格
3.将字符串反转
4.再将字符串里的单词反转,就实现了反转字符串中的单词。

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 reverse(strArr,start,end){
    let left = start,right = end;
    while(left<right){
        [strArr[left],strArr[right]] = [strArr[right],strArr[left]]
        left++;
        right--
    }
}

function removeExtraSpaces(strArr){
    let slowIndex = 0,fastIndex =0;
    while(fastIndex<strArr.length){
        if(strArr[fastIndex] === ' ' && (fastIndex === 0 || strArr[fastIndex - 1] === ' ')){
            // 移除非首位多余空格
            fastIndex++
        } else {
            strArr[slowIndex++] = strArr[fastIndex++]
        }
    }
    strArr.length = strArr[slowIndex - 1] === ' '? slowIndex-1:slowIndex //移除末尾空格
}

5.左旋转字符串

题目描述

在这里插入图片描述

解题思路

1.反转字符串前n位字母
2.反转从n到结尾的字符串
3.反转整个字符串

var reverseLeftWords = function(s, n) {
   const strArr = s.split('')
   reverse(strArr,0,n-1)
   reverse(strArr,n,strArr.length)
   reverse(strArr,0,strArr.length)
   return strArr.join('')
};

var reverse = function(strArr,start,end){
   let left = start,right=end
   while(left < right){
       [strArr[left],strArr[right]] =[strArr[right],strArr[left]]
       left++
       right--
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值