代码随想录算法训练营第一天| 151.翻转字符串里的单词 卡码网:55.右旋转字符串
Leetcode 151.翻转字符串里的单词
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/
思路:
1、封装函数 removeKongGe
去除字符串中多余的首尾空格,中间空格
2、封装函数reverseString
反转整个字符串[start,end)
3、封装函数reverseWord
反转单词顺序
4、调用主函数reverseWords
图示:
代码:
class Solution {
public String reverseWords(String s) {
// 去除字符串中多余的首尾空格,中间空格
StringBuilder str = removeKongGe(s);
// 翻转整个字符串
reverseString(str,0,str.length()-1);
// 反转单词
reverseWord(str);
return str.toString();
}
// 去除字符串中多余的首尾空格,中间空格
public StringBuilder removeKongGe(String s){
int start = 0 ;
int end = s.length() - 1;
StringBuilder str = new StringBuilder();
// 去掉首尾空格
while(s.charAt(start) == ' ') start++;
while(s.charAt(end) == ' ') end--;
// 去掉中间空格
while(start<=end){
char c = s.charAt(start);
// StringBuilder 是 Java 中常用的字符串缓冲区类,适用于频繁修改字符串的场景。
// append(): 将指定字符串、字符、布尔值或其他数据类型的表示追加到字符串缓冲区的末尾。
if(c != ' ' || str.charAt(str.length() - 1) != ' '){
str.append(c);
}
start++;
}
return str;
}
// 反转[start,end)
public void reverseString(StringBuilder str , int start , int end){
while(start < end){
char temp = str.charAt(start);
str.setCharAt(start,str.charAt(end));
str.setCharAt(end,temp);
start++;
end--;
}
// //索引位1的字符进行替换
// sb.setCharAt(1, 'E');
// System.out.println("索引位1的字符进行替换后的结果:" + sb);
// 索引位1的字符进行替换后的结果:hEllo
}
// 反转单词顺序
public void reverseWord(StringBuilder str){
int start =0;
int end = 1;
int n = str.length();
while(start<n){
while(end<n && str.charAt(end) != ' '){
end++;
}
reverseString(str , start ,end-1);
start = end +1 ;
end = start +1 ;
}
}
}
总结:
注意去掉空格中的删除中间空格操作
卡码网:55.右旋转字符串
题目链接:https://kamacoder.com/problempage.php?pid=1065
题目描述:题目描述
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
输入描述
输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出描述
输出共一行,为进行了右旋转操作后的字符串。
输入示例
2
abcdefg
输出示例
fgabcde
提示信息
数据范围:
1 <= k < 10000,
1 <= s.length < 10000;
思路 : 双指针法
1、声明两个首尾指针
2、将整个字符串反转
3、将字符串分割,反转
图示:
代码:
import java.util.Scanner;
public class Main{
// 将整个字符串倒序
public static void reString(char[] c,int start,int end){
while(start < end){
c[start] ^= c[end];
c[end] ^= c[start];
c[start] ^= c[end];
start++;
end--;
}
}
public static void main (String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String s = in.nextLine();
// 获取字符串的长度
int len = s.length();
// 将字符串转为字符数组
char[] cAll = s.toCharArray();
// 将整个字符串倒序
reString(cAll , 0 , len - 1);
// 将 k = 2 , 假设字符串长度是n , n - k 分别倒序
reString(cAll , 0 ,n - 1);
reString(cAll , n ,len -1);
// 返回需要的字符串
System.out.println(cAll);
}
}
总结:
学习了Scanner的用法
//用给定的输入流创建一个Scanner对象
Scanner in = new Scanner(System.in);
//Integer.parseInt(String)就是将String字符类型数据转换为Integer整型数据,如果遇到不能转换的字符则会抛出异常!
int n = Integer.parseInt(in.nextLine());
//读取输入的下一行内容
String s = in.nextLine();
int x=Integer.parseInt("11");
// 将字符串"11"看成10进制的11,并按10进制输出整数11
int z = Integer.parseInt("11",16);
// 将字符串"11"看成10进制的11,并按10进制输出整数17