344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
字符串专场来啦~~~
344.反转字符串
题目描述 && 测试案例
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
解题思路 && 解题代码
简单题,主要注意一下i < j,以及不要使用额外的空间。可以使用reverse,但我没用,reverse应该不是题目考查的意思。
var reverseString = function(s) {
let i = 0;
let j = s.length - 1;
while(i < j) {
let temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--
}
return s
};
541. 反转字符串II
题目描述 && 测试案例
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:
输入:s = “abcd”, k = 2
输出:“bacd”
解题思路 && 解题代码
var reverseStr = function(s, k) {
const len = s.length;
let resArr = s.split(""); //转为数组
for(let i = 0; i < len; i += 2 * 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("");
};
剑指Offer 05.替换空格
题目描述 && 测试案例
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
解题思路 && 解题代码
首先转为数组字符串
其次扩充数字,每个空格相比%20多了2个位置,所以是strArr.length + count * 2 -1;
最后记得join(“”)
var replaceSpace = function(s) {
//1. 将字符串s转化成字符串数组
let strArr = Array.from(s);
//2.count出有几个空格
let count = 0;
for(let i = 0; i < s.length; i++){
if(strArr[i] == ' ') {
count++
}
}
//left指向末尾
//right进行扩充。
let left = strArr.length - 1
let right = strArr.length + 2 * count - 1;
while(left >= 0) {
if(strArr[left] == ' ') {
strArr[right--] = '0'
strArr[right--] = '2'
strArr[right--] = '%'
left--
} else {
strArr[right--] = strArr[left--]
}
}
return strArr.join('')
};
151.翻转字符串里的单词
题目描述 && 测试案例
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = “the sky is blue”
输出:“blue is sky the”
示例 2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
解题思路 && 解题代码
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++];
}
}
// 移除末尾空格
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--;
}
}
剑指Offer58-II.左旋转字符串
题目描述 && 测试案例
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
解题思路 && 解题代码
var reverseLeftWords = function(s, n) {
let left = s.slice(0, n)
let right = s.slice(n)
return right.concat(left)
};