题解 | #最大四边形面积#

移动字母

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

题目:移动字母
描述:给定一个只包含小写字母的字符串s,牛牛想将这个字符串中的所有'a'字母全部移动到字符串的末尾,而且保证其它字符的相对顺序不变。其中字符串s的长度<=1e6。
示例1:输入:"abcavv",返回值:"bcvvaa"

解法一:
思路分析:首先分析题目,本题理解起来可谓相当简单,就是在已知一连串字母的情况下,通过查找所有的字符,找到字符串里边的字符‘a’,在保证其他字符顺序不变的情况下,将字符a移动末尾,最终形成一个新的字符串,将该字符串输出即可。
——我们可以直接使用暴力法进行判断,当发现字母a的时候,就将a记录次数并跳过,方便之后对字符串进行a的补充,重新创建一个字符串res,只要监测到当前的字符不是a,就将该字符直接输出进res中,正好符合题意中的按照顺序检测。
实例分析:输入:"abcavv"
图片说明
C++核心代码:

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string change(string s) {
        // write code here
        string res = "";//新建一个res的字符串,用来存储
        int count = 0;//记录a的次数
        for(int i = 0; i < s.size();i++){
            if(s[i] != 'a')
                res.push_back(s[i]);//按照顺序输出到res中
            else 
                count++;
        }
        res.append(count,'a');//在res后边添加数量为count的a
        return res;
    }
};

Java核心代码:

import java.util.*;
public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String change (String s) {
        // write code here
        int count = 0;
        String res = "";
        if(s.charAt(0) == 'a' && s.charAt(1) == 'a' && s.charAt(2) == 'a' && s.charAt(3) == 'a')
            return s;
        for(int i = 0;i < s.length();i++){
            if(s.charAt(i) != 'a')
                res += s.charAt(i);
            else
                count++;
        }
        for(int i = 0;i < count;i++)
            res += "a";
        return res;
    }
}

——因为循环了s的所有字符,所以时间复杂度为,只新建了一个用来存储新字符序列的字符串res,所以空间复杂度为

解法二:
思路分析:我们通过上述思想进行分析,上述方法是新建了一个字符串对象res,用来存储不变的字符,那么我们还可以采用两个指针类型i和j,i用来循环,j用来指向需要交换的对象,也就是,当指向a的时候,我们就跳过,但是记下a的下标,只要下一个不是a,那么就将它与a进行交换即可,以此循环排序,最终也能实现最终结果值。
实例分析:
图片说明
C++核心代码:

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string change(string s) {
        // write code here
        int len = s.length();
        int j = 0;//位序
        for( int i = 0 ; i < len ; i ++ )
        {
            if(s[i] != 'a')
            {
                int t = s[j];//交换
                s[j] = s[i];
                s[i] = t;
                j++;//令j指向第一个a的位置
            }
        }
        return s;
    }
};

——在上述代码中,虽说有两个指针,但是只有i指针用来循环,所以其时间复杂度为,不需要额外的存储空间,所以其空间复杂度为

算法自然分析 文章被收录于专栏

在解决问题的同时,不断与人交流学习,通过牛客各式各样的题目,学习分享。

全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151686次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11203次浏览 101人参与
# 不去互联网可以去金融科技 #
20396次浏览 255人参与
# 和牛牛一起刷题打卡 #
18982次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203393次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4972次浏览 30人参与
# OPPO开奖 #
19203次浏览 267人参与
# 通信硬件薪资爆料 #
265924次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2227次浏览 34人参与
# 互联网公司评价 #
97692次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25037次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454871次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53903次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14645次浏览 349人参与
# 硬件人的简历怎么写 #
82286次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19398次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28103次浏览 248人参与
# 学历对求职的影响 #
161242次浏览 1804人参与
# 你收到了团子的OC了吗 #
538745次浏览 6387人参与
# 你已经投递多少份简历了 #
344237次浏览 4963人参与
# 实习生应该准时下班吗 #
96978次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63525次浏览 622人参与
牛客网
牛客企业服务