1.翻转字符串
class Solution {
public void reverseString(char[] s) {
int i = 0;
int j = s.length - 1;
char temp;
while(i<j){
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
}
2.
class Solution {
public String reverseStr(String s, int k) {
char[] str = s.toCharArray();
for(int i = 0; i < str.length; i += 2*k){
int start = i;
int end = Math.min(str.length-1, start+k-1); //到字符串末尾,不够k个字符
while(start < end){
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
return new String(str);
}
}
3.替换空格字符
(1)双指针法
class Solution {
public static String replaceSpace(String s) {
String emptyS = "";
if (s == null) { //返回空字符串
return null;
}
if (s.length()==0) {
return emptyS;
}
StringBuilder str = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == ' '){
str.append(" ");
}
}
if(str.length() == 0){ //没有空格 直接返回
return s;
}
int left = s.length() - 1; 左指针:指向原始字符串最后一个位置
s += str.toString(); //转换后的完整长度
int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置
char[] chars = s.toCharArray();
while(left>=0){
if(chars[left] == ' '){ //替换right所指内容为02%
chars[right--] = '0';
chars[right--] = '2';
chars[right] = '%';
}else{
chars[right] = chars[left];
}
left--;
right--;
}
return new String(chars);
}
}
(2)库函数
4.
class Solution {
public String reverseWords(String s) {
StringBuilder sb = removeSpace(s); //去除多余空格
reverseString(sb, 0, sb.length() - 1); //翻转整个字符串
reverseEachWord(sb); //翻转每个单词
return sb.toString();
}
private StringBuilder removeSpace(String s) {
int start = 0;
int end = s.length() - 1;
while(s.charAt(start)==' ') start++;
while(s.charAt(end)==' ') end--;
StringBuilder sb = new StringBuilder();
while(start<=end){
char c = s.charAt(start);
if(c!=' '||sb.charAt(sb.length()-1)!=' '){ //保证只填加至多1个空格
sb.append(c);
}
start++;
}
return sb;
}
private void reverseString(StringBuilder sb, int start, int end){
while(start<end){
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
private void reverseEachWord(StringBuilder sb){
int start = 0;
int end = 1;
while(start < sb.length()){
while(end < sb.length() && sb.charAt(end)!=' '){
end++;
}
reverseString(sb, start, end-1);
start = end + 1;
end = start + 1;
}
}
}
5
class Solution {
public String reverseLeftWords(String s, int n) {
//先翻转局部,再翻转整体
StringBuilder sb = new StringBuilder(s);
reverseWords(sb, 0, n-1);
reverseWords(sb, n, s.length()-1);
reverseWords(sb, 0, s.length()-1);
return sb.toString();
}
public StringBuilder reverseWords(StringBuilder sb, int start, int end){
while(start < end){
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
return sb;
}
}