Leetcode代码算法(字符串) —— 反转字符串 、反转字符串II、替换空格 、翻转字符串里的单词、左旋转字符串

这篇博客介绍了LeetCode中关于字符串操作的四道题目,包括反转字符串、反转字符串II、替换空格、翻转字符串里的单词以及左旋转字符串。通过双指针和字符串反转技巧解决这些问题,提供了详细的解题思路和代码实现。

反转字符串

Leetcode题目链接

本题使用双指针即可实现:一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。过程如下:

代码如下:

var reverseString = function(s) {
  for (let i = 0, j = s.length - 1; i < j; i++, j--) {
    const temp = s[i];
    s[i] = s[j];
    s[j] = temp;
  };
  return s;
};

反转字符串II

Leetcode题目链接

本题的关键是确定循环的间隔:每个2k个字符循环一次。然后对当前子字符串的后k个做反转处理。

代码如下:

var reverseStr = function (s, k) {
  const reverse = (strArr, start, end) => {
    for (let i = start, j = end - 1; i < j; i++, j--) {
      [strArr[i], strArr[j]] = [strArr[j], strArr[i]];
    }
    return strArr;
  }

  const round = Math.ceil(s.length / (2 * k));
  const strArr = s.split('');

  for (let roundIndex = 0; roundIndex < round; roundIndex++) {
    const start = roundIndex * 2 * k;

    if (strArr.length <= start + k) {
      reverse(strArr, start, strArr.length);
    } else if (strArr.length > start + k) {
      reverse(strArr, start, start + k);
    }
  }

  return strArr.join('');
};

替换空格

Leetcode题目链接

本题实际上不需要用额外辅助空间。使用双指针法,从后向前替换空格即可。过程如下:

代码如下:

var replaceSpace = function (s) {
  const strArr = s.split('');

  const spaceCount = strArr.reduce((total, charCode) => {
    if (charCode === ' ') {
      total++;
    }
    return total;
  }, 0);

  const newStrArr = [];
  const newStrLength = strArr.length + spaceCount * 2;

  let j = newStrLength - 1;

  for (let i = strArr.length - 1; i >= 0; i--) {
    if (strArr[i] === ' ') {
      newStrArr[j] = '0';
      newStrArr[j - 1] = '2';
      newStrArr[j - 2] = '%';
      j = j - 3;
    } else {
      newStrArr[j] = strArr[i];
      j--;
    }
  }

  return newStrArr.join('');
};

翻转字符串里的单词

Leetcode题目链接

本题的解题思路如下:

  • 移除多余空格
  • 将整个字符串反转
  • 将每个单词反转

举个例子,源字符串为:"the sky is blue "

  • 移除多余空格 : "the sky is blue"
  • 字符串反转:"eulb si yks eht"
  • 单词反转:"blue is sky the"

多余的空格可以使用双指针法移除。

代码如下:

var reverseWords = function (s) {
  const strArr = s.trim().split('');

  let isPreValidCode = false;
  let slow = 0;

  for (let i = 0; i < strArr.length; i++) {
    if (strArr[i] !== ' ') {
      strArr[slow] = strArr[i];
      slow++;
      isPreValidCode = true;
    } else {
      if (isPreValidCode) {
        strArr[slow] = strArr[i];
        slow++;
      }
      isPreValidCode = false;
    }
  }

  let newStrArr = strArr.reduce((arr, code, index) => {
    if (index < slow) {
      arr.push(code);
    }
    return arr;
  }, []);

  const reverse = (arr, start, end) => {
    for (let i = start, j = end; i < j; i++, j--) {
      [arr[i], arr[j]] = [arr[j], arr[i]];
    }
    return arr;
  }

  reverse(newStrArr, 0, newStrArr.length - 1);

  for (let i = 0, j = 0; j < newStrArr.length + 1; j++) {
    if (newStrArr[j] === ' ' || j === newStrArr.length) {
      reverse(newStrArr, i, j - 1);
      i = j + 1;
    }
  }

  return newStrArr.join('');
};

左旋转字符串 

Leetcode题目链接

本题的关键是如何使用反转函数。具体步骤:

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

例如:字符串abcdefg,n=2

 代码实现如下:

var reverseLeftWords = function (s, n) {
  const reverse = (arr, start, end) => {
    for (let i = start, j = end; i < j; i++, j--) {
      [arr[i], arr[j]] = [arr[j], arr[i]];
    }
    return arr;
  }

  const strArr = s.split('');

  reverse(strArr, 0, n - 1);
  reverse(strArr, n, strArr.length - 1);
  reverse(strArr, 0, strArr.length - 1);

  return strArr.join('');
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值