华为8.26笔试编程题

第一题:
输入一行32位的无符号整数数组,不定长,用空格分隔,要求对它们做“加密”:
步骤A:交换:对于每个整数,按二进制每两位交换,第一位和第二位换,第三和第四换,以此类推。如0010,交换成0001。
步骤B:循环右移:对于每个整数,按二进制右移两位,右移出来的最低2位放到下一个数的最高2位,以此类推。最后一个数的最低2位安到第一个数的最高2位。如果只有一个数,则右移后的最低两位放到自己的最高位。
输出“加密”后的数。
示例:输入1 2,输出1073747824  2147483648
第二题:输入一组矩形,分别给出宽和高,求这些矩形组成的连续最大面积(最大柱状图面积的变形)。
这题算法上leetcode有变形,算法倒是不难。比较费事的是输入格式,输入的是 “[1,2,3],[1,2,3]" 这样的一行字符串,第一个数组是宽,第二个数组是高,用c++费了好大劲一个个字符串处理的,这时候特别想念Python的split.
这题还考了边界处理,包括非法字符,两个数组长度不对等,宽<=0或高<=0的情况。不处理边界只能拿70%,别问我怎么知道的。😣
第三题:猜数字
给定一系列字符串,并告诉你每个字符串中有多少个字符是存在的并在最终位置上,有多少个字符存在,但是位置不对。请根据它们猜出正确的字符串。
示例:字符串,存在并位置对的个数,存在但是位置不对的个数
cloxy 3 0
cxmnu 1 1
kcotd  2 1
apqud  2 0
bldwz  1 1
答案:cloud

搬运工有话说:第一题和第三题都交了白卷,大神来上个答案呗。
#笔试题目##华为#
全部评论
https://paste.ubuntu.com/p/ZfjHk8qnXt/ 第一题ac,暴力转二进制,用long
4 回复 分享
发布于 2020-08-26 21:43
第一题关键就是两部分,先是交换位置: `((input & 0x55555555) << 1) | ((input & 0xaaaaaaaa) >> 1);` 然后移位:     uint32_t left = 0, now = 0;     for (uint32_t i = 0; i < V.size(); ++i)     {         now = V[i] & 0x00000003;         V[i] = (V[i] >> 2) | (left << 30);         left = now;     }     V[0] = V[0] | (left << 30); 直接cout就行
3 回复 分享
发布于 2020-08-26 21:52
第三题给的字符串长度可以不一样吗?
1 回复 分享
发布于 2020-08-26 22:29
1 回复 分享
发布于 2020-08-27 11:03
11
点赞 回复 分享
发布于 2020-08-26 21:22
第二题看到输入直接倒回去做第一题了
点赞 回复 分享
发布于 2020-08-26 21:26
第二题可以不用输入一整串字符串,可以按照字符+整数挨个输入。😂
点赞 回复 分享
发布于 2020-08-26 21:26
第二题有用递归做的吗?
点赞 回复 分享
发布于 2020-08-26 21:28
第一题转为二进制字符串就很简单了
点赞 回复 分享
发布于 2020-08-26 21:35
第一题可以转化成字符串操作,第二题的话应该用单调栈,第三题的话可以用回溯的方法(不过数据量大了应该会爆)
点赞 回复 分享
发布于 2020-08-26 21:54
第一题的java实现,代码写不下,主要逻辑如下 😅     public void test() {         //2.(2位)交换         StringBuilder sb; String[] ss; //输入存储至ss         sb = new StringBuilder();          for (int i = 0; i < ss.length; i++) {             long num = Long.parseLong(ss[i]);             sb.append(bitShift(Long.toBinaryString(num)));         }         //3.(2位)循环右移         int len = sb.length();         String res = sb.substring(len - 2, len) + sb.substring(0, len - 2);         //4.字符串转数         sb = new StringBuilder();         for (int i = 0; i < res.length(); i = i + 32) {             long ni = Long.parseLong(res.substring(i, i + 32), 2); //这里只能用long             sb.append(" ").append(ni); //strB2num         }         //输出sb     }     private String bitShift(String s) {         s = "00000000000000000000000000000000" + s;         char[] cc = s.substring(s.length() - 32).toCharArray();         for (int i = 1; i < cc.length; i += 2) {               //swap         }         return new String(cc);     }
点赞 回复 分享
发布于 2020-08-27 01:28
老哥我也是,非科班,1 3交了白卷,第二题ac80%,但是边界条件我都考虑了,不知道那20错哪了,哭😣
点赞 回复 分享
发布于 2020-08-27 07:25
第一题python转二进制只需要bin()就行,第二题print(0)就可以过30%😅
点赞 回复 分享
发布于 2020-08-27 11:03
第一个测试用例写错了一点吧
点赞 回复 分享
发布于 2020-08-27 11:13
第一问的结果给错了吧,应该是1073741824,不是1073747824
点赞 回复 分享
发布于 2022-03-23 20:41

相关推荐

02-16 22:13
门头沟学院 Java
Yki_:女生学成这样挺不错了,现在停止网课,立刻all in八股,从最频繁的开始背,遇到不会的知识点直接问AI,项目也别手敲,直接看技术文档,背别人总结好的面试官可能问的问题的答案,遇到不会的再去代码里找具体实现就可以了,3月份开始边背边投实习约面
点赞 评论 收藏
分享
会员标识
02-20 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
评论
10
60
分享

创作者周榜

更多
牛客网
牛客企业服务