请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。(哈弗曼编码)

本文解析了美团点评的几道编程面试题,包括哈夫曼编码实现字符串最短编码、筛选序列直至只剩一个数的问题、二维数组沿主对角线打印、以及基于股票价格序列计算最大收益等。通过具体的代码示例,展示了算法的设计与实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

美团点评2016研发工程师编程题(二)


请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。


输入描述:
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。


输出描述:
一行输出最短的编码后长度。

输入例子:
MT-TECH-TEAM

输出例子:

33


分析:哈夫曼编码的过程,用一个最小堆实现,将当前最小的两个数取出来,求和后继续推入堆中。

代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <queue>  
  3. #include <algorithm>  
  4. #include <functional>  
  5. #include <string>  
  6. using namespace std;  
  7. int main() {  
  8.     string s;  
  9.     while (getline(cin, s)) {  
  10.         int ret=0;  
  11.         int n = s.size();  
  12.         sort(s.begin(), s.end());  
  13.         int cnt = 0;  
  14.         priority_queue<int, vector<int>, greater<int> > heap;  
  15.         for (int i = 0, j; i < n;) {  
  16.             j = i;  
  17.             while (j < n && s[j] == s[i]) ++j;  
  18.             heap.push(j - i);  
  19.             i = j;  
  20.             ++cnt;  
  21.         }  
  22.         for (int i = 0; i < cnt-1; i++) {  
  23.             int a = heap.top();  
  24.             heap.pop();  
  25.             int b = heap.top();  
  26.             heap.pop();  
  27.             heap.push(a+b);  
  28.             ret += a + b;  
  29.               
  30.   
  31.         }  
  32.         cout << ret << endl;  
  33.   
  34.     }  
  35.     return 0;  
  36. }  



  1. #include<map>  
  2. #include<iostream>  
  3. #include<string>  
  4. using namespace std;  
  5. struct BTreeNode    
  6. {    
  7.     int weight;