LeetCode 344 翻转字符串
注: 此处是 left < right 因为当left 和 right处于同一位置时,无需进行原地翻转
package algor.trainingcamp;
/**
* @author lizhe
* @version 1.0
* @description: 翻转字符串
* @date 2023/4/12 08:26
*/
public class LeetCode344 {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while(left < right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
LeetCode 541 翻转字符串II
每次相隔2k,翻转k个元素,注意 翻转k个元素 和 整体长度的大小关系,可能会超出长度
class Solution {
public String reverseStr(String s, int k) {
char[] charArray = s.toCharArray();
//每次计数到2k
for(int i = 0;i < s.length();i+= 2 * k){
int left = i;
int right = Math.min(s.length() - 1, left + k - 1);
char tmp;
while(left < right){
tmp = charArray[left];
charArray[left] = charArray[right];
charArray[right] = tmp;
left++;
right--;
}
}
return new String(charArray);
}
}
JZ_05 替换空格
package algor.trainingcamp;
/**
* @author lizhe
* @version 1.0
* @description: 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
* @date 2023/4/12 12:44
*/
public class JZ_05 {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if(c == ' '){
sb.append("%20");
}else{
sb.append(c);
}
}
return sb.toString();
}
}
LeetCode151 翻转字符串的单词
注: 先去除首尾 和 中间的多余空格 然后进行全部单词翻转,再按照单个单词翻转
package algor.trainingcamp;
/**
* @author lizhe
* @version 1.0
* @description: 151. 反转字符串中的单词
* @date 2023/4/12 13:06
* 给你一个字符串 s ,请你反转字符串中 单词 的顺序。
* 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
* 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
* 注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。
* 返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
* <p>
* 1. 去除首尾空格
* 2. 逆转所有
* 3. 逆转每个单词
eg:" hello world" => "hello world" => "dlrow olleh" => 'world hello'
*/
public class LeetCode151 {
public String reverseWords(String s) {
//
StringBuilder sb = removeBlock(s);
reverseString(sb, 0, sb.length() - 1);
reverseWord(sb);
return sb.toString();
}
/**
* 去除首尾,且中间存在多个空格的情况
*/
public StringBuilder removeBlock(String s) {
int left = 0;
int right = s.length() - 1;
StringBuilder sb = new StringBuilder();
while (s.charAt(left) == ' ') {
left++;
}
while (s.charAt(right) == ' ') {
right--;
}
//去除中间存在多个空格的情况(保证了一组单词只有一个间隔)
for(int i = left;i <= right;i++){
char c = s.charAt(i);
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
}
return sb;
}
/**
* 找到每个单词的首位 进行逆转
*/
public void reverseWord(StringBuilder sb){
int left = 0;
int right = 1;
/**
* 类似滑动窗口
*/
while(left < sb.length()){
while(right < sb.length() && sb.charAt(right) != ' '){
right++;
}
//找到了一组[left,right]
reverseString(sb,left,right - 1);
//继续寻找下一个区间
left = right + 1;
right = left + 1;
}
}
/**
* 翻转字符串的指定位置 从start 到end进行翻转
*/
public void reverseString(StringBuilder sb, int start, int end){
while(start < end){
char tmp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, tmp);
start++;
end--;
}
}
public static void main(String[] args) {
LeetCode151 demo = new LeetCode151();
System.out.println(demo.reverseWords(" hello world"));
}
}
JZ_58_2 字符串的左旋转
注: 特殊方法,先将单个部分进行旋转,然后进行整体旋转
package algor.trainingcamp;
/**
* @author lizhe
* @version 1.0
* @description:
* 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
* 请定义一个函数实现字符串左旋转操作的功能。
* 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
*
* 特殊方法 => 先逆转(0, n - 1) 再逆转(n,s.length - 1) 最后直接倒序输出即可
*/
public class JZ_58_2 {
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder(s);
reverse(sb, 0, n - 1);
reverse(sb, n, s.length() - 1);
return sb.reverse().toString();
}
public void reverse(StringBuilder sb, int start, int end){
while(start < end){
char tmp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, tmp);
start++;
end--;
}
}
}