【校招笔试】字符编码(哈夫曼树)
来源:互联网 发布:熊猫tv直播软件 编辑:程序博客网 时间:2024/05/13 06:24
时间限制:1秒 空间限制:32768K 热度指数:629
本题知识点: 贪心
题目描述:
请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。
输入描述
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。
输出描述
一行输出最短的编码后长度。
输入例子
MT-TECH-TEAM
输出例子
33
解题思路(以输入例子为例)
- 统计各个字符出现的个数,如下:
M(2), T(3), E(2), C(1), H(1), A(1), -(2) - 画出哈夫曼树,如下:
- 发现编码后字符串的长度等于:各个非叶子结点值之和(2+3+5+4+7+12)
- 利用这个,用HashMap存字符出现的个数,PriorityQueue优先队列选出两个最小的结点值
代码
import java.util.*;//比较器(没有用)class Comparators { public static Comparator getComparator() { return new Comparator() { @Override public int compare(Object o1, Object o2) { if (o1 instanceof Integer) { return compare( (Integer) o1, (Integer) o2); } else return 1; } public int compare(Integer s1, Integer s2) { return s2-s1; } }; }}public class Main { /* 测试代码 */ public static void main(String []args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String str = sc.nextLine(); HashMap<Character, Integer> map = new HashMap<Character, Integer>(); for(int i = 0; i < str.length(); i++) { Character c = str.charAt(i); if (map.containsKey(c)) { map.put(c, map.get(c)+1); } else { map.put(c, 1); } } PriorityQueue<Integer> queue = new PriorityQueue<Integer>(); for(Character i : map.keySet()) { queue.add(map.get(i)); } int ans = 0; while(!queue.isEmpty()) { int num1 = queue.poll(); int num2 = queue.poll(); ans += (num1+num2); if(!queue.isEmpty())queue.add(num1+num2); } System.out.println(ans); } }}
0 0
- 【校招笔试】字符编码(哈夫曼树)
- 百度2012校招笔试题之位数和编码
- 【校招笔试】股票交易日(dp)
- 小米校招笔试题(java)
- 2014校招笔试
- 阿里校招笔试
- WAP校招笔试
- 校招笔试题
- SUHO2018校招笔试
- 【笔试or面试】阿里巴巴2014校招笔试(哈尔滨)
- 美团笔试:字符编码
- [笔试] 2016校招 中国银行校招(信息科技岗位)笔试+面试+收到体检
- 华为校招(字符集合)python
- 2016hua为校招:笔试上机题目:游程编码、解码
- 腾讯2017秋招笔试编程题(四)----geohash编码
- HULU2012校招笔试体会
- Google 2012校招笔试
- 一些校招笔试题
- hdoj 5969 最大的位或 (位或)
- java与c语言的比较
- 野指针
- POJ:2718 Smallest Difference(暴力枚举)
- 解决腾讯云windows系统能ping通内网地址,ping不通网关和公网地址
- 【校招笔试】字符编码(哈夫曼树)
- oracle数据库删除重复记录
- Linux下运用C/C++实现txt文件的读写
- java 集合 Collection接口 List 和Set
- Java学习--day2-parttwo
- 集合的学习
- 记录:Service的使用
- SVM-支持向量机原理详解与实践之三
- JAVA关键字