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('')
}