4-字符串-21-反转字符串 II-LeetCode541
参考:代码随想录
LeetCode: 题目序号541
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
技术公众号:CodeZeng1998(纯纯技术文)
生活公众号:好锅(Life is more than code)
CSDN: CodeZeng1998
其他平台:CodeZeng1998、好锅
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
1 <= s.length <= 104s仅由小写英文组成1 <= k <= 104
/**
* 反转字符串 II
*
* @param s 字符串
* @param k 步长
* @return 处理后的字符串
* @author CodeZeng1998
*/
public String reverseStr(String s, int k) {
int start = 0;
StringBuilder resultStringBuilder = new StringBuilder();
while (start < s.length()) {
int reversBeginIndex = (start + k) > s.length() ? s.length() : start + k;
int reversEndIndex = (start + 2 * k) > s.length() ? s.length() : (start + 2 * k);
resultStringBuilder.append(
reverseString(s.substring(start, reversBeginIndex).toCharArray()));
if (reversBeginIndex < reversEndIndex) {
resultStringBuilder.append(s, reversBeginIndex, reversEndIndex);
}
start = start + 2 * k;
}
return resultStringBuilder.toString();
}
/**
* 反转字符串(双指针)
*
* @param s 待反转的字符串
* @author CodeZeng1998
*/
public String reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while (left <= right) {
char tempChar = s[right];
s[right] = s[left];
s[left] = tempChar;
left++;
right--;
}
return new String(s);
}
ChatGPT:
这段代码的功能是对输入字符串 s 进行特定规则的反转。具体来说,每隔 2k 个字符反转前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转;如果剩余字符在 k 到 2k 之间,则反转前 k 个字符,剩余部分保持不变。
1. reverseStr 方法:
初始化和准备:
start变量初始化为0,用于记录当前处理的起始位置。resultStringBuilder被初始化为一个StringBuilder对象,用于构建最终的结果字符串。
循环处理字符串:
- 使用
while循环,条件是start小于字符串s的长度。这意味着会逐步处理整个字符串。
计算反转范围:
reversBeginIndex:计算反转结束的位置。如果start + k超过了字符串的长度,则取字符串的长度作为反转结束位置。reversEndIndex:计算当前处理块的结束位置。如果start + 2 * k超过了字符串的长度,则取字符串的长度作为处理块结束位置。
反转和拼接:
- 将
s从start到reversBeginIndex的子串转换为字符数组,然后调用reverseString方法对其进行反转。反转后的子串添加到resultStringBuilder中。 - 如果
reversBeginIndex小于reversEndIndex,说明在当前块中还有部分未反转的字符,将这些字符直接添加到resultStringBuilder中。
更新起始位置:
- 将
start更新为start + 2 * k,准备处理下一个块。
返回结果:
- 最后,将
resultStringBuilder转换为字符串并返回,得到最终的结果。
2. reverseString 方法:
初始化指针:
left指针从数组的起始位置开始,初始值为0。right指针从数组的末尾位置开始,初始值为s.length - 1。
进入循环:
- 使用
while循环,当left指针小于或等于right指针时,循环继续执行。这个条件确保了指针从两端向中间移动,直到相遇或交错。
交换字符:
-
在每次循环迭代中,代码执行以下步骤:
- 将
right指针对应的字符暂存在一个临时变量tempChar中。 - 将
left指针对应的字符赋值给right指针对应的位置。 - 将
tempChar中暂存的字符赋值给left指针对应的位置。
- 将
移动指针:
-
交换完字符后,移动两个指针:
left指针加一,向右移动一位。right指针减一,向左移动一位。
循环结束:
- 当
left指针大于right指针时,表示所有字符都已经交换完毕,整个数组实现了原地反转。
返回结果:
- 将字符数组转换为字符串并返回。
示例过程: 假设输入字符串为 "abcdefg",k 为 2:
-
初始状态:
start = 0,resultStringBuilder为空。 -
第一次迭代:计算
reversBeginIndex = 2,reversEndIndex = 4- 反转
"ab"得到"ba",添加到resultStringBuilder。 - 添加
"cd"到resultStringBuilder,结果为"bacd"。 - 更新
start为4。
- 反转
-
第二次迭代:计算
reversBeginIndex = 6,reversEndIndex = 7- 反转
"ef"得到"fe",添加到resultStringBuilder。 - 添加
"g"到resultStringBuilder,结果为"bacdfe"。 - 更新
start为8。
- 反转
-
循环结束,返回结果
"bacdfe"。
通过以上步骤,函数按要求对字符串进行了特定规则的反转。
Given a string s and an integer k, reverse the first k characters for every 2k characters counting from the start of the string.
If there are fewer than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and leave the other as original.
Example 1:
Input: s = "abcdefg", k = 2
Output: "bacdfeg"
Example 2:
Input: s = "abcd", k = 2
Output: "bacd"
Constraints:
1 <= s.length <= 104sconsists of only lowercase English letters.1 <= k <= 104
上图是由 Pic 生成的
关键词:a lot of people watching the moon on the snowy mountain
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
技术公众号:CodeZeng1998(纯纯技术文)
生活公众号:好锅(Life is more than code)
CSDN: CodeZeng1998
其他平台:CodeZeng1998、好锅