题解 | #字符统计#

字符统计

http://www.nowcoder.com/practice/c1f9561de1e240099bdb904765da9ad0

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        char[] originalChrs = scan.nextLine().toCharArray();
        HashSet<Character> hashSet = new HashSet<>();
        HashMap<Character, Integer> everyCharOccurrences = new HashMap<>();
        for (char currentChr : originalChrs) {
            hashSet.add(currentChr);
            int occurrences = everyCharOccurrences.getOrDefault(currentChr, 0) + 1;
            everyCharOccurrences.put(currentChr, occurrences);
        }
        char[] ans = new char[hashSet.size()];
        int index = 0;
        for (char tmpChr : hashSet) {
            ans[index++] = tmpChr;
        }
        mergeSort(ans, everyCharOccurrences);
        StringBuffer sb = new StringBuffer("");
        for (char tmpChr : ans) {
            sb.append(tmpChr);
        }
        System.out.println(sb);
    }
    public static void mergeSort(char[] chrs, HashMap<Character, Integer> nums) {
        if (null == chrs || chrs.length < 2) {
            return;
        }
        process(chrs, 0, chrs.length - 1, nums);
    }
    public static void process(char[] chrs, int start, int end, HashMap<Character, Integer> nums) {
        if (start >= end) {
            return;
        }
        int mid = start + ((end - start) >> 1);
        process(chrs, start, mid, nums);
        process(chrs, mid + 1, end, nums);
        merge(chrs, start, mid, end, nums);
    }
    public static void merge(char[] chrs, int start, int mid, int end, HashMap<Character, Integer> nums) {
        char[] helper = new char[end - start + 1];
        int index = 0;
        int p1 = start;
        int p2 = mid + 1;
        while (p1 <= mid && p2 <= end) {
            if (nums.get(chrs[p1]) > nums.get(chrs[p2])) {
                helper[index++] = chrs[p1++];
            } else if (nums.get(chrs[p1]) < nums.get(chrs[p2])) {
                helper[index++] = chrs[p2++];
            } else {
                helper[index++] = chrs[p1] <= chrs[p2] ? chrs[p1++] : chrs[p2++];
            }
        }
        while (p1 <= mid) {
            helper[index++] = chrs[p1++];
        }
        while (p2 <= end) {
            helper[index++] = chrs[p2++];
        }
        for (int i = 0; i < helper.length; i++) {
            chrs[start + i] = helper[i];
        }
    }
}
全部评论
该牛油正在参与牛客写题解薅羊毛的活动,牛币,周边,京东卡超多奖品放送,活动进入倒计时!快来捡漏啦https://www.nowcoder.com/discuss/888949?source_id=profile_create_nctrack&channel=-1
点赞 回复 分享
发布于 2022-04-20 17:05

相关推荐

用微笑面对困难:不是你千万别小看这家公司,他们的预估市值成倍上涨,三次在报告看见这个公司了,总之如果是给股权的话可以试试,未来没准真能发家致富哈哈哈哈
点赞 评论 收藏
分享
牛客26575669...:ARM都错了,有些HR看到这一行简历就进垃圾桶了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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