题解 | #移动字母#

移动字母

http://www.nowcoder.com/practice/1e5655d7c7be4566b386eb925afcb206

题意整理

  • 给定一个只包含小写字母的字符串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的字符数组,所以空间复杂度是
xqxls的题解 文章被收录于专栏

牛客题解

全部评论

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务