class Solution {public void reverseString(char[] s) {int left = 0;
int right = s.length - 1;
while(left< right){s[left] ^= s[right];
s[right] ^= s[left];
s[left] ^= s[right];
left++;
right--;
}
}
}
此題使用雙向指針即可,無難度;關(guān)鍵
:此題使用了異或運(yùn)算,異或可以代替三角交換,需要熟悉。
class Solution {public String reverseStr(String s, int k) {char[] ch = s.toCharArray();
for(int i = 0; i< ch.length; i += 2 * k){int start = i;
int end = Math.min(i + k - 1,ch.length - 1);
while(start< end){ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
此題與上一題類似,區(qū)別在于只翻轉(zhuǎn)部分的字符串,對(duì)其進(jìn)行變量控制即可。
三、劍指 Offer 05. 替換空格class Solution {//使用一個(gè)新的對(duì)象,復(fù)制 str,復(fù)制的過程對(duì)其判斷,是空格則替換,否則直接復(fù)制,類似于數(shù)組復(fù)制
public static String replaceSpace(String s) {if (s == null) {return null;
}
//選用 StringBuilder 單線程使用,比較快,選不選都行
StringBuilder sb = new StringBuilder();
//使用 sb 逐個(gè)復(fù)制 s ,碰到空格則替換,否則直接復(fù)制
for (int i = 0; i< s.length(); i++) {//s.charAt(i) 為 char 類型,為了比較需要將其轉(zhuǎn)為和 " " 相同的字符串類型
//if (" ".equals(String.valueOf(s.charAt(i)))){}
if (s.charAt(i) == ' ') {sb.append("%20");
} else {sb.append(s.charAt(i));
}
}
return sb.toString();
}
//方式二:雙指針法
public String replaceSpace(String s) {if(s == null || s.length() == 0){return s;
}
StringBuffer sb = new StringBuffer();
for(int i = 0;i< s.length(); i++){if(s.charAt(i) == ' '){sb.append(" ");
}
}
//若是沒有空格直接返回
if(sb.length() == 0){return s;
}
int left = s.length() - 1;
s += sb.toString();
int right = s.length() - 1;
char[] ch = s.toCharArray();
while(left>=0){if(ch[left] == ' '){ch[right--] = '0';
ch[right--] = '2';
ch[right] = '%';
}else{ch[right] = ch[left];
}
left--;
right--;
}
return new String(ch);
}
}
此題有兩種解法:
解法一:new一個(gè)StringBuilder(),判斷是否為空格進(jìn)行追加就行,無難度
解法二:遍歷數(shù)組得出有多少空格,算出數(shù)組的大小,從后往前填充數(shù)組;從后往前遍歷數(shù)組是該算法的關(guān)鍵
class Solution {public String reverseWords(String s) {// 1.去除首尾以及中間多余空格
StringBuilder sb = removeSpace(s);
// 2.反轉(zhuǎn)整個(gè)字符串
reverseString(sb, 0, sb.length() - 1);
// 3.反轉(zhuǎn)各個(gè)單詞
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);
//如果是空格就跳過(這里需要保留第一個(gè)空格所以需要||后面的那個(gè)條件存在)
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {sb.append(c);
}
start++;
}
return sb;
}
//翻轉(zhuǎn)字符串,使用方法setCharAt();
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--;
}
}
private void reverseEachWord(StringBuilder sb) {int start = 0;
int end = 1;
int n = sb.length();
while (start< n) {//首先找到第一個(gè)單詞后面的空格,然后翻轉(zhuǎn)單詞
while (end< n && sb.charAt(end) != ' ') {end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}
}
此題的思路是:先翻轉(zhuǎn)整個(gè)字符串,再翻轉(zhuǎn)單個(gè)單詞。具體看代碼內(nèi)的注釋。
五、劍指Offer58-II.左旋轉(zhuǎn)字符串class Solution {public String reverseLeftWords(String s, int n) {int len=s.length();
StringBuilder sb=new StringBuilder(s);
reverseString(sb,0,n-1);
reverseString(sb,n,len-1);
return sb.reverse().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--;
}
}
}
與上一題類似,使用局部翻轉(zhuǎn)加全局翻轉(zhuǎn)即可實(shí)現(xiàn)左旋字符串。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧