编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
链接:https://leetcode.cn/problems/reverse-string
var reverseString = function(s) {
var n = s.length - 1;
var index_l = Math.floor(n / 2);
var index_r = index_l + 1;
var temp = 0;
// 字符串元素个数为奇数时
if(s.length % 2 != 0) {
// 中间的元素不交换,左指针向前遍历
index_l--;
for(var i = index_l; i < n-1; i++) {
temp = s[index_l];
s[index_l] =s[index_r];
s[index_r] = temp;
index_l--;
index_r++;
}
}
// 字符串元素个数为偶数时
else {
for(var i = index_l; i < n; i++) {
temp = s[index_l];
s[index_l] =s[index_r];
s[index_r] = temp;
index_l--;
index_r++;
}
}
};
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
· 如果剩余字符少于 k 个,则将剩余字符全部反转。
· 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
链接:https://leetcode.cn/problems/reverse-string-ii
var reverseStr = function(s, k) {
var res = [];
var len = s.length;
for (var i = 0; i < len; i += 2 * k) {
// 需要反转的所有部分
needStr = s.substring(i, i + k).split('').reverse().join('');
// 需要保留的所有部分
lastStr = s.substring(i + k, i + 2 * k);
// concat 进行拼接
res.push(needStr.concat(lastStr));
}
return res.join('');
};
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
链接:力扣
var replaceSpace = function(s) {
var res = s.split("");
for(var i = 0; i < s.length; i++) {
if(res[i] == " ") {
res[i] = "%20";
}
}
return res.join("");
};
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
链接:https://leetcode.cn/problems/reverse-words-in-a-string
var reverseWords = function(s) {
var res = s.split("");
// 移除多余空格
var slow = 0, fast = 0;
while(fast < res.length) {
// 开头是空格,或是有重复空格
if(res[fast] == " " && (fast == 0 || res[fast - 1] == " ")) fast++;
// 否则继续遍历
else res[slow++] = res[fast++];
}
// 末尾是空格
if(res[slow - 1] == " ") res.length = slow - 1;
else res.length = slow;
// 整体翻转数组
reverse(res, 0, res.length - 1);
// 每个单词的首字母
var str = 0;
// 翻转每个单词
for(var i = 0; i <= res.length; i++) {
if (res[i] == " " || i == res.length) {
// 翻转单词
reverse(res, str, i-1)
str = i + 1;
}
}
return res.join("");
};
function reverse(res, start, end) {
var left = start, right = end;
while(left < right) {
// 交换
[res[left], res[right]] = [res[right], res[left]];
left++;
right--;
}
}
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
var reverseLeftWords = function(s, k) {
// 截取需要的部分
var needStr = s.substring(0, k);
// 截取剩余的部分
var lastStr = s.substring(k, s.length);
return lastStr.concat(needStr);
};
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string
var strStr = function(haystack, needle) {
for(var i = 0; i + needle.length <= haystack.length; ++i) {
var flag = 1;
for(var j = 0; j < needle.length; ++j) {
if(haystack[i + j] != needle[j]) {
flag = 0;
break;
}
}
if(flag) return i;
}
return -1;
};
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
链接:力扣
var repeatedSubstringPattern = function(s) {
var str = s + s;
return str.substring(1, str.length - 1).includes(s);
};