面试题——算法:字符串按指定顺序排序

按照指定顺序进行排序

在这里插入图片描述
解题思路:
1、将顺序表转换为hashMap,key = a-Z,value = 对应的顺序,这样就能最大限度的降低时间复杂度
2、之后通过遍历输入的字符串,自定义sort方法,通过比较map中对应的顺序,进行排序。

难点在于 将字符转化为ASCII值的思路、以及将规则转换为HashMap的想法
其中
a对应 97 z对应122
A对应65 Z对应904
0对应 48 9对应57

public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        List<Character> list = new LinkedList<>();
        StringBuffer sb = new StringBuffer();
        //a-z : 97-122    A-Z: 65 -90  0-9 : 48-57
        int l = 97;
        int r = 110;
        int z = 48;
        HashMap<Character,Integer> hashMap = new HashMap<>();
        for (int i =1,j =26,o =27;i<=25&& j>=2 || o<=35;i+=2,j-=2,o++){
            // 从a c e 单数对应的字母插入
            // 且小写  此处是保存 a-m
            hashMap.put((char)l++,i);
            // a-33 =A A  c、d也是如此,同理
            // 此处是保存 A-M
            hashMap.put((char)(l-33),i);
            // n 对应 110,此处是保存小写n-z
            // 此处是保存  n-z
            hashMap.put((char)r++,
                    j);
            // 对应N
            // 此处保存  N-Z
            hashMap.put((char)(r-33),j);
            if(o <= 36){
                hashMap.put((char)z++,o);
            }
        }

        char[] chars = s.toCharArray();
        for (char c :chars){
            list.add(c);
        }
        list.sort(new Comparator<Character>() {
            @Override
            public int compare(Character o1, Character o2) {
                if (hashMap.get(o1) > hashMap.get(o2)){
                    return 1;
                }else if (hashMap.get(o1).equals(hashMap.get(o2))){
                    return Character.isUpperCase(o1)?1:-1;
                }
                return -1;
            }
        });
        for (Character character:list){
            sb.append(character);
        }
        System.out.println(sb.toString());

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值