451 Sort Characters By Frequency

451. Sort Characters By Frequency

先统计次数,再按次数构造新的string。思路没什么难,写起来还有点麻烦。用了priorityqueue。。

	class Wrapper {
		public char c;
		public int freq;

		public Wrapper(char c, int freq) {
			this.c = c;
			this.freq = freq;
		}
	}

	public String frequencySort(String s) {
		if (s==null || s.length() == 0) return "";
		Map<Character, Integer> map = new HashMap<>();
		Set<Character> set = new HashSet<>();
		for (int i = 0; i < s.length(); i++) {
			int count = map.getOrDefault(s.charAt(i), 0);
			map.put(s.charAt(i), ++count);
			set.add(s.charAt(i));
		}
		PriorityQueue<Wrapper> pq = new PriorityQueue<>(new Comparator<Wrapper>() {
			@Override
			public int compare(Wrapper o1, Wrapper o2) {
				return o1.freq - o2.freq;
			}
		});
		for (char c : set) {
			pq.offer(new Wrapper(c, map.get(c)));
		}
		StringBuilder sb = new StringBuilder();
		while (!pq.isEmpty()) {
			Wrapper w = pq.poll();
			for (int i = 0; i < w.freq; i++) {
				sb.insert(0, w.c);
			}
		}
		return sb.toString();
	}
复制代码

因为用了PriorityQueue所以复杂度是O(nlogn)。 看了别人的答案,有个是O(n)的,用了数组的index表示出现的次数。而且,我上面用了hashset,因为我不太会hashmap的遍历,下面的代码也展示了hashmap的遍历方法, for(char c : map.keySet()):

public String frequencySort(String s) {
    if (s == null) {
        return null;
    }
    Map<Character, Integer> map = new HashMap();
    char[] charArray = s.toCharArray();
    int max = 0;
    for (Character c : charArray) {
        if (!map.containsKey(c)) {
            map.put(c, 0);
        }
        map.put(c, map.get(c) + 1);
        max = Math.max(max, map.get(c));
    }

    List<Character>[] array = buildArray(map, max);

    return buildString(array);
}

private List<Character>[] buildArray(Map<Character, Integer> map, int maxCount) {
    List<Character>[] array = new List[maxCount + 1];
    for (Character c : map.keySet()) {
        int count = map.get(c);
        if (array[count] == null) {
            array[count] = new ArrayList();
        }
        array[count].add(c);
    }
    return array;
}

private String buildString(List<Character>[] array) {
    StringBuilder sb = new StringBuilder();
    for (int i = array.length - 1; i > 0; i--) {
        List<Character> list = array[i];
        if (list != null) {
            for (Character c : list) {
                for (int j = 0; j < i; j++) {
                    sb.append(c);
                }
            }
        }
    }
    return sb.toString();
}
复制代码

转载于:https://juejin.im/post/5a31314af265da430f32191a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工业和信息化部关于印发信息通信建设工程预算定额、工程费用定额及工程概预算编制规程的通知 发布时间:2017-02-10 来源:通信司 工信部通信[2016]451号 各省、自治区、直辖市通信管理局,中国电信集团公司、中国移动通信集团公司、中国联合网络通信集团有限公司、中国铁塔股份有限公司,相关单位: 为适应通信建设行业发展需要,合理有效控制通信建设工程投资,规范通信建设工程计价行为,根据国家法律法规及有关规定,我部对《通信建设工程概算、预算编制办法》及相关定额(2008年版)进行修订,形成了《信息通信建设工程预算定额》(共五册:第一册通信电源设备安装工程、第二册有线通信设备安装工程、第三册无线通信设备安装工程、第四册通信线路工程、第五册通信管道工程)、《信息通信建设工程费用定额》及《信息通信建设工程概预算编制规程》,现予以发布,自2017年5月1日起施行。工业和信息化部《关于发布及相关定额的通知》(工信部规〔2008〕75号)同时废止。 工业和信息化部 2016年12月30日 抄送:工业和信息化部通信工程定额质监中心 (《信息通信建设工程预算定额》、《信息通信建设工程费用定额》及《信息通信建设工程概预算编制规程》由工业和信息化部通信工程定额质监中心组织出版、发行。)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值