题意整理
- 给定一个只包含小写字母的字符串s。
- 将所有'a'字符移到末尾,并且保证其他字符相对位置不变。
方法一(直接复制)
1.解题思路
- 将字符串转化为字符数组。
- 遍历字符数组,将所有非'a'字符按顺序填到字符数组。
- 将剩下的位置填满'a'字符。
- 再将字符数组转化为字符串返回。
2.代码实现
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return string字符串
*/
public String change (String s) {
//转化为字符数组
char[] arr=s.toCharArray();
int n=arr.length;
//赋值游标
int id=0;
for(int i=0;i<n;i++){
//如果不是'a',按顺序填到arr数组中
if(arr[i]!='a'){
arr[id++]=arr[i];
}
}
//剩下位置,补满'a'
for(int i=id;i<n;i++){
arr[i]='a';
}
return String.valueOf(arr);
}
}3.复杂度分析
- 时间复杂度:只需要一次线性遍历,所以时间复杂度是
。
- 空间复杂度:需要额外长度为n的字符数组,所以空间复杂度是
。
方法二(双指针)
1.解题思路
- 将字符串转化为字符数组。
- 遍历字符数组,只要是非'a'字符,就与j处字符交换,并且j指针后移。
- 将字符数组转化为字符串返回。
动图展示:
2.代码实现
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return string字符串
*/
public String change (String s) {
//初始化字符数组
char[] arr=s.toCharArray();
int n=arr.length;
//定义指针j,指向最左边a出现的位置
int j=0;
for(int i=0;i<n;i++){
//如果i对应字符不是'a',就与j交换,同时j后移一位
if(arr[i]!='a'){
char c=arr[i];
arr[i]=arr[j];
arr[j++]=c;
}
}
return String.valueOf(arr);
}
} 3.复杂度分析
- 时间复杂度:只需要一次线性遍历,所以时间复杂度是
。
- 空间复杂度:需要额外长度为n的字符数组,所以空间复杂度是
。

京公网安备 11010502036488号