目录
翻转字符串里的单词
题目链接:151. 反转字符串中的单词
---给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路:首先需要得到有效的字符串数组(去除多余空格),然后将整个数组反转,最后将单词反转就完成了
删除空格的思路:
设置快慢指针slow,fast;slow定位在要修改的初始下标,fast一直遍历数组。
为设置单词之间的空格需要注意,当slow==0时,此时不需要动slow。当slow != 0时,我们需要在填充单词开始之时手动添加一个空格
//使两单词之间能有一个空格,且slow也能在要修改的初始下标
if(slow > 0 && ch[fast] != ' ')
ch[slow++] = ' ';
完整代码:
class Solution {
public String reverseWords(String s) {
char[] ch = getNormal(s);
//先将整体翻转
reverseWordsHelp(ch,0,ch.length - 1);
//局部翻转
int slow = 0,fast = 0;
//fast <= ch.length() 这里的 = ,是为了让 fast 永远指向单词末尾后一个位置,这样 reverseWordsHelp 的实参更好设置
for(; fast <= ch.length; fast++){
if(fast== ch.length || ch[fast] == ' '){
reverseWordsHelp(ch,slow,fast - 1);
slow =fast + 1;
}
}
return new String(ch);
}
//将字符串s变成有效的字符串(删除多余空格使其变成正常的英文句子)数组
public char[] getNormal(String s){
char[] ch = s.toCharArray();
int slow = 0;
for(int fast = 0; fast < ch.length; fast++){
//使两单词之间能有一个空格,且slow也能在要修改的初始下标
if(slow > 0 && ch[fast] != ' ')
ch[slow++] = ' ';
while(fast < s.length() && ch[fast] != ' ')
ch[slow++] = ch[fast++];
}
char[] newChars = new char[slow];
System.arraycopy(ch, 0, newChars, 0, slow);
return newChars;
}
//翻转一定区间内的字符串
public void reverseWordsHelp(char[] ch,int left,int right){
while(left < right){
char tmp = ch[left];
ch[left] = ch[right];
ch[right] = tmp;
left++;
right--;
}
}
}
右旋字符串
题目链接:55. 右旋字符串(第八期模拟笔试)
---字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
思路: 首先还是先反转整个字符数组,然后反转[0,k-1]区间内的字符数组,最后反转[k,s.length-1]区间内的字符数字就完成了
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
char[] ch = s.toCharArray();
reverseStr(ch,0,ch.length - 1);
reverseStr(ch,0,n-1);
reverseStr(ch,n,ch.length - 1);
System.out.println(new String(ch));
}
public static void reverseStr(char[] ch,int start,int end){
if(end >= ch.length)return;
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
}