华为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

相关推荐

与火:这不接? 留子的钱不挣白不挣
点赞 评论 收藏
分享
10 60 评论
分享
牛客网
牛客企业服务