字母排序

问题描述:实现对一组无序的字母进行从小到大排序(区分大小写),当两个字母相同时,小写字母放在大写字母前。要求时间复杂度为O(n).

分析:如果没有时间复杂度的要求,可以采用传统的插入排序或快速排序的算法,但是传统的排序算法最好的时间复杂度为O(nlogn),不能满足题目的要求。对于时间复杂度高的问题,可以使用空间换时间的方法,可采用以下思路:使用长度为52的整形数组,用来存储每个字母出现的个数,数组的偶数下标存放小写字母,奇数下标存放大写字母(aAbB...zZ),当记录完成后,可以遍历数组按照各个字母出现的次数重组排序后的数组。

package com.wyl;
/**
 * 字母排序
 * 问题描述:实现对一组无序的字母进行从小到大排序(区分大小写),当两个字母相同时,
 * 小写字母放到大写字母之前。要求时间复杂度为O(n)
 * @author wyl
 *
 */
public class CharacterSort {
    /**
     * 声明一个长度为52的数组,代表52个字母,用来存放每个字母出现的个数
     */
    public static void charSort(char[] arr){
        if(arr == null){ //数组为空
            System.out.println("输入参数不合法");
            return;
        }
        int[] chars = new int[52]; //声明长度为52的数组,代表52个字母,用来保存字母出现的次数
        //数组的偶数位存放小写字母出现的次数,奇数位存放大写字母出现的次数
        for(int i=0;i<arr.length;i++){
            if(arr[i]>='a' && arr[i]<='z'){
                //出现小写字母,存放在偶数位
                chars[(arr[i]-'a')*2]++;
            }else if(arr[i]>='A' && arr[i]<='Z'){
                //出现大写字母,存放在奇数位
                chars[(arr[i]-'A')*2 + 1]++;
            }
        }
        //根据chars数组中的个数,改变arr中字母的顺序
        int index = 0;
        for(int i=0;i<chars.length;i++){
            if(chars[i]>0){//个数大于0 
                if(i%2 == 0){//偶数位,为小写字母
                    for(int j=0;j<chars[i];j++){ //个数是多少就打印多少次
                        arr[index++] = (char) ('a'+ i/2);
                    }
                }else{
                    for(int j=0;j<chars[i];j++){ //个数是多少就打印多少次
                        arr[index++] = (char) ('A'+ (i-1)/2);
                    }
                }
            }
        }
    }
    
    public static void main(String[] args) {
        char[] chars = {'A','a','C','F','d','B','c','C'};
        charSort(chars);
        for(int i=0;i<chars.length;i++){
            System.out.print(chars[i]+" ");
        }
    }
}

 

转载于:https://www.cnblogs.com/studyDetail/p/7228388.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值