344 反转字符串
和反转链表一样,也是用双指针法。定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
class Solution {
public void reverseString(char[] s) {
int l = 0;
int r = s.length -1;
while(l<r){
char temp = s[l]; //定义一个temp来存储中间值
s[l] = s[r];
s[r] = temp;
l++;
r--;
}
}
}
541 反转字符串Ⅱ
上一题的升级版
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(ch.length-1, start+k-1); //将end定义为数组的长度和前k个字符的最小值
while(start<end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
54替换数字
先预先给数组扩容到填充后的大小,然后再从后向前进行操作。实质上也是双指针法,i指向新长度的末尾,j指向旧长度的末尾。
import java.util.Scanner;
public class Main{
public static String replace(String s){
int count=0;
int oldsize =s.length();
for(int i=0; i<s.length();i++){
if(Character.isDigit(s.charAt(i))){
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
char[] newS = new char[s.length()+count*5];
int newsize=newS.length;
//将旧字符串的内容填入到新数组
System.arraycopy(s.toCharArray(),0,newS,0,oldsize);
// 从后先前将空格替换为"number"
for(int i=newsize-1,j=oldsize-1;j<i;j--,i--){
if(!Character.isDigit(newS[j])){
newS[i]=newS[j];
}else{
newS[i]='r';
newS[i-1]='e';
newS[i-2]='b';
newS[i-3]='m';
newS[i-4]='u';
newS[i-5]='n';
i-=5;
}
}
return new String(newS);
}
public static void main (String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(replace(s));
scanner.close();/* code */
}
}