华为笔试讨论帖 开发岗


如题,今晚的华为笔试难度和室友他们做的不是一个级别啊
室友大概是半个月前的笔试,听说很简单
今晚这个,,em
有今晚笔试的小伙伴出来讨论下吗
#华为#
全部评论
第一题:map搞搞 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <algorithm> #include <iostream> #include <map> using namespace std; char s[100005]; map<char,int> m; int main() {     while(gets(s))     {         int cnt = -1;         int pos = 100000005;         char ans;         m.clear();         int len = strlen(s);         for(int i = 0; i < len; ++i)         {             if(s[i] >= 'a' && s[i] <= 'z')             {                 s[i] = s[i] - 32;             }             if(s[i] >='A' && s[i] <= 'Z')             {                 m[s[i]]++;             }             if(m[s[i]] >= cnt)             {                 cnt = m[s[i]];                 ans = s[i];                 //pos = i;             }         }         for(int i = 0; i < len; ++i)         {             if(m[s[i]] == cnt)             {                 ans = s[i];                 break;             }         }         cout<<ans<<cnt<<endl;     }     return 0; } 第二题 哈弗曼树:DFS+优先队列模拟 #include <cstdio> #include <iostream> #include <set> #include <string> #include <cstring> #include <map> #include <algorithm> #include <queue> #include <vector> using namespace std; const int maxn = 1e5; vector<int> num[300]; struct Node{     Node *left;     Node *right;     int id;     int code;     int num;     friend bool operator < (const Node &a ,const Node &b){         return a.num > b.num;     } }a[maxn]; priority_queue< Node > q; string Code[300]; void dfs(Node *root,string now){    if (root->left == NULL  && root->right == NULL){         Code[root->code] = now;         return;    }    string Now = now;    if (root->left != NULL) dfs(root->left,Now + "0");    if (root->right != NULL) dfs(root->right,Now + "1"); } int main(){     string s;     cin >> s;     for (int i = 0; i < (int)s.size(); i++){         num[s[i]].push_back(i);     }     int cnt = 0;     while (!q.empty()) q.pop();     for (int i = 0; i < 300; i++){         if ((int)num[i].size() > 0){             a[cnt].code = i;             a[cnt].id = cnt;             a[cnt].num = (int)num[i].size();             a[cnt].left = NULL;             a[cnt].right = NULL;             q.push(a[cnt]);             cnt++;         }     }     while (q.size() > 1){         Node fr1 = q.top();         q.pop();         Node fr2 = q.top();         q.pop();         a[cnt].left = &a[fr1.id];         a[cnt].right = &a[fr2.id];         a[cnt].id = cnt;         a[cnt].num = fr1.num + fr2.num;         q.push(a[cnt]);         cnt++;     }     Node f = q.top();     q.pop();     Node *Root = &f;     dfs(Root,"");     for (int i = 0; i < (int) s.size(); i++){         cout << Code[s[i]];     }     cout << endl; } 第三题:题意不清的模拟题,过不去,过了40% 请AC的大佬指正还需要注意那些细节,谢谢! #include <cstdio> #include <iostream> #include <algorithm> #include <vector> int main() {     int n, x;     scanf("%d", &n);     bool head = true, flag = true;     int pre = 0;     std::vector< int > ans;     while(flag && n--) {         scanf("%x", &x);         if(!x) {             if(!n) {                 flag = false;                 break;             }             scanf("%x", &x);             --n;             if(x > 15) flag = false;             else if(head) {                 pre = x;                 head = false;             } else if((pre + 1) % 16 != x) flag = false;             else pre = x;             if(!n) {                 flag = false;                 break;             }             scanf("%x", &x);             --n;             int t = x >> 4, len = x & 15;             std::vector< int > d;             if(len > n) {                 flag = false;                 break;             }             while(len--) {                 scanf("%x", &x);                 d.push_back(x);                 --n;             }             if(t == 1 || t == 2) std::sort(d.begin(), d.end());             if(t == 2) ans.insert(ans.end(), d.begin(), d.end());             else ans.insert(ans.end(), d.rbegin(), d.rend());         }     }     if(flag) {         for(int i = 0; i < ans.size(); ++i) {             if(i) printf(" ");             printf("0x%x", ans[i]);         }         puts("");     } else puts("FALSE");     return 0; }
点赞 回复 分享
发布于 2018-09-26 21:24
。。。。。我是补笔试的。。。只做出来第一题。。感觉凉凉啊。。
点赞 回复 分享
发布于 2018-09-26 21:14
list2=[] list3=[] class Node(object): def__init__(self,name=None,value=None): self._name=name self._value = value self._left=None self._right = None class HuffmanTree(object): def __init__(self, char_weights): self.a=[Node(part[0],part[1])for part in char_weights] while len(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='' for i 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() for j in set(i): dic.append((j,i.count(j))) char_weights=dic tree = HuffmanTree(char_weights) tree.get_code() r='' for l in i: for m in range(len(list2)): if l==list2[m]: r+=str(list3[m]) print r # # abbcccdddd # 1101111111010100000 测试用例 为什么和我的不一样,求大佬告知!
点赞 回复 分享
发布于 2018-09-26 21:14
100 100 0,做得要哭了
点赞 回复 分享
发布于 2018-09-26 21:10
第二题就没写出来  哈夫曼感觉要写很长很长啊
点赞 回复 分享
发布于 2018-09-26 21:10
面试完让我补笔试。。。做了今晚的想哭
点赞 回复 分享
发布于 2018-09-26 21:09
目前难度: 阿里>百度>华为
点赞 回复 分享
发布于 2018-09-26 21:09
不怕,做一题就能面试了
点赞 回复 分享
发布于 2018-09-26 21:08
你也是补考吗?
点赞 回复 分享
发布于 2018-09-26 21:04

相关推荐

点赞 评论 收藏
分享
08-23 19:16
莆田学院 Java
1.算法:给定一个宽度为n的无限高游戏界面,初始每列已有一定高度的方块(用数组表示),然后依次下落一系列特定形状的俄罗斯方块(每个方块由若干格子组成),要求模拟下落过程(方块会落到底部或已有方块上),并最终输出游戏界面各列的新高度。思路:对于每个下落方块,根据其形状(需考虑旋转和平移)在初始高度数组上尝试放置:从顶部向下扫描,检查方块底部与当前界面是否碰撞(即方块所占格子的下方是否已有方块或超出底部),找到最低的合法位置后更新对应列的高度(取原高度与方块放置后新高度的最大值),依次处理所有方块即可得到最终各列高度。2.算法:给定n艘船的耐久度数组a和攻击次数k,海盗攻击顺序为左右交替(先左端、再右端、再左端第二艘、右端第二艘,以此类推),每次攻击减少目标船1点耐久,求攻击结束后耐久值非正的船的数量。思路:由于k可能很大,直接模拟每次攻击会超时。通过计算完整攻击轮数(每轮左右各一次)和剩余攻击次数,可确定每艘船实际被攻击的次数:左侧船主要受左端攻击,右侧船主要受右端攻击。遍历每艘船,根据其位置计算所受攻击次数(左侧第i艘船被左端攻击次数为轮数加可能的额外左攻击),若耐久值小于等于攻击次数则被击沉,统计总数即可。
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
8
分享

创作者周榜

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