344、反转字符串
题目链接
思路
本题思路比较简单,直接头尾两个指针,对头尾两指针进行遍历,互相交换即可。
代码实现
class Solution {
public void reverseString(char[] s) {
int i = 0;
int j = s.length - 1;
while(i < j){
char tmp;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++;
j--;
}
}
}
541、反转字符串Ⅱ
题目链接
思路
本题的思路就是遍历整个数组,遍历的步长为2*k,因为最后可能会出现不足2k的情况,所以要比较一下字符串的结尾和遍历指针+K的位置,求最小值作为end,交换start和end的元素即可。
代码实现
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(charArray.length - 1,start+k-1);
while(start < end){
char tmp;
tmp = charArray[start];
charArray[start] = charArray[end];
charArray[end] = tmp;
start++;
end--;
}
}
// return new String(charArray);
return String.valueOf(charArray);
}
}
剑指offer 05、替换空格
题目链接
思路
定义一个StringBuffer,如果字符串中的字符不为空格,直接插入stringbuffer,如果为空格,则按照%20插入
代码实现
class Solution {
public String replaceSpace(String s) {
if(s == null){
return null;
}
StringBuffer sb = new StringBuffer();
for(int i = 0;i < s.length();i++){
if(s.charAt(i)==' '){
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
151、反转字符串中的单词
题目链接
思路
1、去除多余的空格
2、将整个字符串反转
3、将每个单词反转
代码实现
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) != ' ')){
sb.append(c);
}
start++;
}
return sb;
}
private void reverseString(StringBuilder sb,int start,int end){
while(start <= end){
char tmp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,tmp);
start++;
end--;
}
}
private void reverseEachWord(StringBuilder sb){
int n = sb.length();
int start = 0;
int end = 1;
while(start < n){
while(end < n && sb.charAt(end) != ' '){
end++;
}
reverseString(sb,start,end-1);
start = end + 1;
end = start + 1;
}
}
}
剑指offer58-Ⅱ、左旋转字符串
题目链接
思路
1、先反转字符串的前n个字符
2、反转字符串中剩余的字符
3、反转整个字符串
代码实现
class Solution {
public String reverseLeftWords(String s, int n) {
char[] ch = s.toCharArray();
reverse(ch,0,n-1);
reverse(ch,n,s.length()-1);
reverse(ch,0,s.length()-1);
return String.valueOf(ch);
}
private void reverse(char[] ch,int left,int right){
while(left < right){
char tmp;
tmp = ch[left];
ch[left] = ch[right];
ch[right] = tmp;
left++;
right--;
}
}
}