题解 | 小红的字符串构造

import java.util.Scanner;
import java.util.HashSet;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        String s = new Scanner(System.in).nextLine().trim();
        HashSet<String> set = new HashSet<>();
        for(int i=0;i<s.length();i++) set.add(s.substring(i,i+1));
        
        if(set.size()<2){System.out.println(-1);}
        else{
            
        //创建列表
        List<String> list = new ArrayList<>();
        for(String tmp:set) list.add(tmp);

        HashMap<String,String> hsp = new HashMap<>();

        //列表映射
        for(int i=0;i<list.size();i++) hsp.put(list.get(i),list.get((i+1)%list.size()));

        //纯粹的用String去+=非常耗时,需要用StringBuffer动态字符串!
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<s.length();i++) sb.append(hsp.get(s.substring(i,i+1)));
        System.out.println(sb.toString());
        }
    }
}

对比其他人的题解,我这里强调2个重点:

①字符映射,用来省时间。提前创建a->b,b->c,c->d的映射(set一下原字符串s,把set里面的字符每一个都映射到他的下一个位置,超出size了就取模到第一个,刚好覆盖所有字符集又不会和原位置重合,满足题目要求)

②动态字符串构建,如果用String+=,即便用了方法①,也会超时,原因是String+=是不断创建新字符串,相当于new了很多下,非常耗时,所以我们要用StringBuffer动态字符串,才不会超时。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 11:30
找工作7个月,投了7000封,3段世界五百强实习,才有一个offer,牛油们肯定比我强吧
码农索隆:不对不对不对,实习经历这么厉害,简历也没少投,问题出在哪呢
点赞 评论 收藏
分享
06-15 20:57
已编辑
门头沟学院 Java
CARLJOSEPH...:年轻人有傲气很正常,但是建议工作前洗净傲气。 说实在的,什么奖学金什么奖项的都很一般。尊重你的老师,在有时间的时候去上课,真遇到走不开的事,请态度端正地向你的老师说明情况,请求请假。我相信任何一个有师德的老师都会允许的(我的老师就是这样)。
点赞 评论 收藏
分享
Twilight_m...:经典我朋友XXXX起手,这是那种经典的不知道目前行情搁那儿胡编乱造瞎指导的中年人,不用理这种**
点赞 评论 收藏
分享
我看看你怎么个事来
牛牛爱吃草草:我看看你怎么个事来
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务