「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」
前言
今日的题目为简单,发现春节这段时间都是简单题,可能是官方为了让大家过个好年。
每日一题
今天的每日一题为 2000. 反转单词前缀,难度为简单
-
给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。
-
例如,如果 word = "abcdefd" 且 ch = "d" ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 "dcbaefd" 。
-
返回 结果字符串 。
示例 1:
输入:word = "abcdefd", ch = "d"
输出:"dcbaefd"
解释:"d" 第一次出现在下标 3 。
反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "dcbaefd" 。
示例 2:
输入:word = "xyxzxe", ch = "z"
输出:"zxyxxe"
解释:"z" 第一次也是唯一一次出现是在下标 3 。
反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "zxyxxe" 。
示例 3:
输入:word = "abcd", ch = "z"
输出:"abcd"
解释:"z" 不存在于 word 中。
无需执行反转操作,结果字符串是 "abcd" 。
提示:
- 1 <= word.length <= 250
- word 由小写英文字母组成
- ch 是一个小写英文字母
题解
暴力解法
首先我们可以利用字符串的 indexOf 方法查找字符ch在word中的位置,并且用一个变量index保存下出现的位置,如果为-1则不存在且不需要进行操作,直接返回word,存在就继续对字符串进行操作,题目中要求ch出现的位置也算在内,所以,需要反转的字符串就是0-index,然后就是需要反转这部分字符串并且返回反转后的字符串。
循环反转
然后反转字符串部分,我们可以从0-index拿到需要反转部分的开头和结尾,可以利用一个循环,只需要循环index/2次,然后每次将对称的两个字符对换最后返回反转后的整个字符串。
/**
* @param {string} word
* @param {character} ch
* @return {string}
*/
var reversePrefix = function (word, ch) {
const index = word.indexOf(ch);
if (index >= 0) {
const arr = [...word];
let left = 0, right = F;
for (let i = 0; i < index / 2; i++) {
const temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
word = arr.join('');
}
return word;
};
双指针反转
上面反转字符串的方法除了循环需要字符串的一半这种方法,还可以用双指针的方法进行反转,我们可以把定义好的left和right看为两个指针,每次循环后left++,right--,只有当left>right的时候结束循环,那么上面反转部分也可以写成:
if (index >= 0) {
const arr = [...word];
let left = 0, right = index;
while (left < right) {
const temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
word = arr.join('');
}