344.反转字符串
class Solution {
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--;
}
}
}
541.反转字符串II
class Solution {
public String reverseStr(String s, int k) {
char[] charArray = s.toCharArray();
for(int i = 0; i < charArray.length;i += 2*k){
int start = i;
int end = Math.min(start+k-1,charArray.length-1);
while(start <end){
char temp = charArray[start];
charArray[start] = charArray[end];
charArray[end] = temp;
end--;
start++;
}
}
return new String(charArray);
}
}
剑指offer05 替换空格
方法1 StringBuilder 替换(简洁)
class Solution {
public String replaceSpace(String s) {
if(s == null){
return s;
}
StringBuilder sb = new StringBuilder();
for(char c : s.toCharArray()){
if(c == ' '){
sb.append("%20");
}else{
sb.append(c);
}
}
return sb.toString();
}
}
这版本代码比较简单高效,重点是,构建stringbuilder,利用stringbuilder的append 和toString进行替换空格。
方法二 双指针
class Solution {
public String replaceSpace(String s) {
if(s == null || s.length() == 0){
return s;
}
StringBuilder str = new StringBuilder();
for(char c : s.toCharArray()){
if(c == ' '){
str.append(" ");
}
}
int left = s.length()-1;
s += str.toString();
int right = s.length()-1;
char[] chars = s.toCharArray();
while(left >= 0){
if(chars[left]==' '){
chars[right--] = '0';
chars[right--] = '2';
chars[right] = '%';
}else{
chars[right] = chars[left];
}
left--;
right--;
}
return new String(chars);
}
}
151.翻转字符串里的单词
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();
sb = removeSpace(s);
reverseString(sb,0,sb.length()-1);
reverseEachWords(sb);
return sb.toString();
}
private StringBuilder removeSpace(String s){
StringBuilder sb = new StringBuilder();
int start = 0;
int end = s.length()-1;
while(s.charAt(start) == ' ') start++;
while(s.charAt(end) == ' ') end--;
while(start <= end){
if(s.charAt(start) != ' ' || sb.charAt(sb.length()-1)!=' '){
char c = s.charAt(start);
sb.append(c);
}
start++;
}
return sb;
}
public 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--;
}
}
public void reverseEachWords(StringBuilder sb){
int start = 0;
int end = 1;
int n = sb.length();
while(start < n){
while(end < n && sb.charAt(end)!=' ') {
end++;
}
reverseString(sb,start,end-1);
start=end+1;
end = start+1;
}
}
}
剑指Offer58-II.左旋转字符串
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder();
sb.append(s);
reverseString(sb,0,n-1);
reverseString(sb,n,sb.length()-1);
reverseString(sb,0,sb.length()-1);
return sb.toString();
}
public 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--;
}
}
}