题意整理
- 给定一个只包含小写字母的字符串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的字符数组,所以空间复杂度是。