代码随想录算法训练营第八天 | 344. 反转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词

84 阅读1分钟

344. 反转字符串

不能申请额外空间,使用左右指针分别在开头和末尾,每次循环交换值,然后指针同时向中间移动

function reverseString(s: string[]): void {
  let l = 0
  let r = s.length - 1
  while (l < r) {
    const tmp = s[l]
    s[l] = s[r]
    s[r] = tmp
    l++
    r--
  }
};

541. 反转字符串 II

每次循环步进2k长度,在每次循环里把这2k长度的字符串按要求反转即可

function reverseStr(s: string, k: number): string {
  let res = ''
  let l = 0
  while (l < s.length) {
    res += reverse(s.substring(l, l + 2 * k), k)
    l += 2 * k
  }
  return res
};
function reverse(s: string, k: number) {
  return `${s.substring(0, k).split('').reverse().join('')}${s.substring(k)}`
}

剑指 Offer 05. 替换空格

遍历一遍替换

function replaceSpace(s: string): string {
  const arr = s.split('')
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === ' ') {
      arr[i] = '%20'
    }
  }
  return arr.join('')
};

151. 反转字符串中的单词

不使用split,思路是先移除多余空格,然后反转整个字符串,最后再反转每个单词即可

function reverseWords(s: string): string {
  // 移除多余空格
  const arr = s.split('')
  let preIsSpace = false
  const arr2 = []
  for (const a of arr) {
    if (preIsSpace) {
      if (a !== ' ') {
        arr2.push(a)
        preIsSpace = false
      }
    } else {
      arr2.push(a)
      preIsSpace = a === ' '
    }
  }
  s = arr2.join('')
  s = s.trim()
  // 反转字符串
  s = s.split('').reverse().join('')
  // 每个单词反转
  let l = 0
  let r = 0
  const arr3 = []
  while (r < s.length) {
    if (s[r] === ' ') {
      arr3.push(s.substring(l, r).split('').reverse().join(''))
      r++
      l = r
    } else {
      r++
    }
    if (r === s.length) {
      arr3.push(s.substring(l, r).split('').reverse().join(''))
    }
  }
  return arr3.join(' ')
};

剑指 Offer 58 - II. 左旋转字符串

先把前n个字符反转,再把剩下的字符反转,最后反转整个字符串即可

function reverseLeftWords(s: string, n: number): string {
  return reverse(`${reverse(s.substring(0, n))}${reverse(s.substring(n))}`)
};
function reverse(s: string) {
  return s.split('').reverse().join('')
}