全部评论
为什么牛客网电脑登不上了什么鬼
送花
回复
分享
实在登不上。。。渣渣写法参考一下pan.baidu.com/s/1TtZpNBZ0k4DKQ0WxUQBo4g
送花
回复
分享
滴滴
官网直投
不是很简单吗?我在做百度笔试,看了一下这道题。对字符排序,从最频繁的字符开始编码0,10,110,1110.....111..最后一个数是全部1。搞定
送花
回复
分享
作者:Roronoa_Zzoro 链接:https://www.nowcoder.com/discuss/118895?toCommentId=2002519 来源:牛客网 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 list2=[] list3=[] classNode(object): def__init__(self,name=None,value=None): self._name=name self._value = value self._left=None self._right = None classHuffmanTree(object): def __init__(self, char_weights): self.a=[Node(part[0],part[1])forpart in char_weights] whilelen(self.a)!=1: self.a.sort(key=lambda node:node._value,reverse=True) c=Node(value=(self.a[-1]._value+self.a[-2]._value)) c._left=self.a.pop(-1) c._right=self.a.pop(-1) self.a.append(c) self.root=self.a[0] self.b=range(10) def pre(self,tree,length): node=tree if(not node): return elif node._name: list1='' fori in range(length): list1+=str(self.b[i]) list2.append(node._name) list3.append(list1) return self.b[length]=0 self.pre(node._left,length+1) self.b[length]=1 self.pre(node._right,length+1) def get_code(self): self.pre(self.root,0) if__name__=='__main__': dic=[] i = raw_input() forj in set(i): dic.append((j,i.count(j))) char_weights=dic tree = HuffmanTree(char_weights) tree.get_code() r='' forl in i: form in range(len(list2)): ifl==list2[m]: r+=str(list3[m]) print r # # abbcccdddd #1101111111010100000 测试用例 为什么和我的不一样,求大佬告知!
送花
回复
分享
#include <iostream> #include <queue> #include <map> #include <climits> // for CHAR_BIT #include <iterator> #include <algorithm> #include <vector> #include <string> using namespace std; const int UniqueSymbols = 1 << CHAR_BIT; string SampleString; typedef std::vector<bool> HuffCode; typedef std::map<char, HuffCode> HuffCodeMap; class INode { public: const int f; virtual ~INode() {} protected: INode(int f) : f(f) {} }; class InternalNode : public INode { public: INode *const left; INode *const right; InternalNode(INode* c0, INode* c1) : INode(c0->f + c1->f), left(c0), right(c1) {} ~InternalNode() { delete left; delete right; } }; class LeafNode : public INode { public: const char c; LeafNode(int f, char c) : INode(f), c(c) {} }; struct NodeCmp { bool operator()(const INode* lhs, const INode* rhs) const { return lhs->f > rhs->f; } }; INode* BuildTree(const int(&frequencies)[UniqueSymbols]) { std::priority_queue<INode*, std::vector<INode*>, NodeCmp> trees; for (int i = 0; i < UniqueSymbols; ++i) { if (frequencies[i] != 0) trees.push(new LeafNode(frequencies[i], (char)i)); } while (trees.size() > 1) { INode* childR = trees.top(); trees.pop(); INode* childL = trees.top(); trees.pop(); INode* parent = new InternalNode(childR, childL); trees.push(parent); } return trees.top(); } void GenerateCodes(const INode* node, const HuffCode& prefix, HuffCodeMap& outCodes) { if (const LeafNode* lf = dynamic_cast<const LeafNode*>(node)) { outCodes[lf->c] = prefix; } else if (const InternalNode* in = dynamic_cast<const InternalNode*>(node)) { HuffCode leftPrefix = prefix; leftPrefix.push_back(false); GenerateCodes(in->left, leftPrefix, outCodes); HuffCode rightPrefix = prefix; rightPrefix.push_back(true); GenerateCodes(in->right, rightPrefix, outCodes); } } int main() { // Build frequency table int frequencies[UniqueSymbols] = { 0 }; std::cin >> SampleString; for (int i = 0; i < SampleString.size(); i++) { if(SampleString[i] != '\0') ++frequencies[SampleString[i]]; } INode* root = BuildTree(frequencies); HuffCodeMap codes; GenerateCodes(root, HuffCode(), codes); delete root; for (int i = 0; i < SampleString.size(); i++) { for (HuffCodeMap::const_iterator it = codes.begin(); it != codes.end(); ++it) { if(it->first== SampleString[i]) std::copy(it->second.begin(), it->second.end(), std::ostream_iterator<bool>(std::cout)); } } std::cout << std::endl; return 0; }
送花
回复
分享
ac了,但是写的贼烂…不过没用bean
送花
回复
分享
相关推荐
点赞 评论 收藏
转发
03-30 09:40
门头沟学院 计算机类 点赞 评论 收藏
转发
点赞 评论 收藏
转发