华为数字化IT应用工程师 信息技术工程部 笔试面试经历(凉)
=====================分割线==========================
3/22更新
刚写完帖子就出结果了
感觉是性格方面的吧。
我面试的时候挺紧张的,话也说不好。
面试官问我性格的时候,我实话实说我比较内向。
还有最后那个问题的回答,回答虽然很诚实,但是表现得功利性太强了。
说实话我没看帖子,也没提前准备,华为喜欢考字符串是同学告诉我的。而我却回答了针对性看一些帖子,看看华为比较喜欢考什么。🤣
=====================分割线==========================
3/22更新
主管面来了,刚面完就来写帖子。
主管面
主管面本来是约了20日18点的,后来公司打电话推迟到今天了。
先说一下面试官,我感觉面试官跟一面的长得一模一样。(一面的时候,面试官那边信号不好,把视频关了)
先自我介绍。
面试官问了我项目,项目的角色,我的成绩排名,你最紧张的一件事是什么,最有成就感的一件事,你对于成就感的定义是什么。
你的性格是怎么样的。你的最好的朋友是谁,你最讨厌的一个人是谁。你大学参加了什么活动。你有一件事情,你的计划是什么。
在大学期间你感觉你比别人努力吗。你上大学时候的目标是什么?
反问环节:
1.华为员工的一个成长历程是怎么样的?
面试官:首先有两周的一个文化体验,然后有导师带,六个月后转正答辩。
2.华为的部门之间有壁垒吗?
面试官:基层这边的话,基本上是比较开放的。
最后面试官补充问了一个问题,你笔试成绩不错,是有什么诀窍吗?
我:笔试之前,我会针对性看一些帖子,看看华为比较喜欢考什么。
然后就886。
最后许愿一个offer
=====================分割线==========================
3/20更新
今天11点半进行了一面,面了一个多小时,紧接着2点进行了二面,差不多有50分钟。
先说一下一面
一面
先自我介绍,然后说我在大学学了什么课,然后介绍自己参加的比赛项目。
然后面试官问了我大学成绩排名,GPI,四六级,大学参加了什么活动社团之类的。
然后就问基础了。
面试官:说一下接口和抽象类的区别。
这个问题答案大家自行网上搜。
面试官:说一下Cookie和Session有什么区别。
这里贴一下Guide哥的面试知识点
面试官:说一下List,Set,Map的区别。
这个问题我昨晚突击看Guide哥的Java容器只是简单看了一下,没有准确答出来。
面试官:说一下HashMap的实现。
这里Guide哥也有,好吧,我沦为替Guide哥打广告的工具人了。
最后是代码,主要是给你一个IPv4或者IPv6地址,让你判断这个IP地址是否合法。
没完成,主要是不知道16进制的字符串怎么转换成数字,现在贴一下别人的代码
后面面试官让我说一下思路。
面试官:你觉得你自己有什么技术上的短板吗?
我:动态规划,因为这周以来做的笔试遇到动态规划都没做出来。
然后面试快结束了,面试官问你有什么问题想问面试官的吗?
我:可不可以说一下你对我此次面试的看法?
面试官一个反客为主:你对你自己这次面试有什么评价吗?
我:
二面
一开始自我介绍,跟一面差不多。
面试官只是简单问了一下比赛项目的事。
然后开始一些知识点提问。
面试官:数据库优化怎么做的啊?
我:主要是答了索引。
面试官:说一下二叉树的遍历。
我:4种,第一是层序遍历,其他三种是先序遍历、中序遍历、后序遍历。
面试官:说一下后面三种遍历的思路。
面试官:说一下层序遍历具体是怎么实现的。
我:用栈(答错了,应该用队列)
面试官:说一下字符串匹配算法。
我:答了朴素的字符串匹配,然后答了KMP的思路。
面试官:说一下拓扑排序。
我:不懂。
面试官:那你会什么排序算法啊?
我:选择排序、插入排序、快速排序、冒泡排序、堆排序、归并排序、希尔排序、桶排序、基数排序。
面试官:说一下快速排序的思路,算法复杂度
面试官:快速排序是稳定的吗?
面试官:访问网站的时候,网站加载变慢了,怎么解决?
我:……(支吾了一阵子),可能是网络发生拥塞,应该过一段时间再来看,或者换一个环境。
面试官:还有呢?
我:……查看HTTP状态码,是否是客户端或者服务器的问题……
后来同学说是数据库搜索语句的问题,搜索语句太复杂导致数据库搜索太久了。
最后是代码,也没完成。最后说了一下思路就拜拜了。
* 你有一副手牌,手牌由大于0的整数组成。 * 游戏规则给定一个W,W为一个顺子的长度,并且顺子都是有由连续的数字组成。 * 现在他想把手牌重新排列,问是否能将手牌全部组成顺子。 * 提示: * 1 <= hand.length <= 10000 * 0 <= hand[i] <= 10^9 * 1 <= W <= hand.length * * 解答要求 * 时间限制:1000ms, 内存限制:256MB * * 示例 1: * 输入:hand = [1, 2, 3, 6, 2, 3, 4, 7, 8], W = 3 * 输出:true * 解释:手牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。 * * 示例 2: * 输入:hand = [1, 2, 3, 4, 5], W = 4 * 输出:false * 解释:手牌无法被重新排列成几个大小为 4 的顺子。 * * 示例 3: * 输入:hand = [1, 2, 3, 6, 7, 10], W = 3 * 输出:false * 解释:手牌能排列成长度为3的两个组[1,2,3],[6,7,10], 但是其中一个组不连续,不构成顺子。下面是原文。
=====================分割线==========================
3/18的原文内容
昨晚3/17华为笔试,2小时,第一志愿是数字化IT应用工程师,信息技术工程部,笔试成绩比较理想,第二天就有在华为的前辈找上门说过两天面试,但是我一点准备都没有,还请各位前辈支个招。😭
实不相瞒,去年春招我大三,报名实习生,成功获得了几个大厂的面试机会,被虐得“灰头土脸”,一个offer都没拿到,就灰溜溜跑去考研了(老摇摆不定了)。结果考研成绩也不理想,就只能找工作了。
我是这两天才开始看面试宝典的,这么早给我安排面试,内心慌的一批。求各位前辈大佬给我支个招吧。
下面是昨晚的题目,我的解题方法很直接很暴力,各位看官求轻喷。
1.重复一次的最长长度字串
描述:找出最长最多重复1次的字符子串,例如abcabcbb,它的重复一次的最长长度字串是abcabc,里面有字符abc,很显然,abc三个字符各出现2次,所以应该输出为6。
例子:
输入:
abcabcbb输出:
6
这道题我比较崩,硬是花了1个小时才AC,第一次提交没完全通过,就跳过,后面急死了,调试了好久了才找到bug。
我的思路是:从头开始,将字符加入一个子串里,然后查询该字符在子串中是否出现过了2次,如果出现过了2次,就把第一次出现的字符及其前缀给丢掉。记录子串的长度最大值。 例如,我的子串已经是abcabc了,这个时候再加入b,就变成abcabcb了,b出现了3次,就把前面的ab去掉,变成了cabcb。
我的代码如下:
import java.util.Scanner; public class One { public static void main(String[] args) { // 输入 Scanner scanner = new Scanner(System.in); String str = scanner.nextLine(); int n = str.length(); if (str.substring(n - 4).equals("NULL")) { str = str.substring(0, n - 4); n -= 4; } if (n <= 2) { System.out.println(n); } else { int count, max = 2, index = 0; String substr = str.substring(0, 2); char c; boolean flag; for (int i = 2; i < n; i++) { count = 0; c = str.charAt(i); flag = true; for (int j = 0; j < substr.length(); j++) { if (c == substr.charAt(j)) { count++; if (count == 1) { index = j; } } if (count == 2) { substr = substr.substring(index + 1) + c; flag = false; break; } } if (flag) { substr = substr + c; } if (substr.length() > max) { max = substr.length(); } } System.out.println(max); } } }
2.赛程排序
具体怎么描述我也忘了,就是输入一个2的n次幂的数(2<=n<=12),代表一共有2^n个队伍,然后给这些队伍排比赛。数字越小的队伍,实力越强,为了观赏性和节目效果,就把最强和最弱的优先安排一起比赛。
例如
例1
输入:
4
输出: ((1,4),(2,3))
(1,4)是一组比赛,决出胜者之后,就跟另一组(2,3)的胜者进行比赛,于是就有((1,4),(2,3))
例2
输入:
8
输出: (((1,8),(4,5)),((2,7),(3,6)))
我的思路是:查找它是2的几次幂,例如8,是2的3次幂,意味着要进行三轮比赛,然后从第一轮开始生成它的比赛序列。
因为一轮比赛很好做的,设一个头指针和尾指针,分别从两头遍历,然后生成一对比赛了,就把它保存到一个数组,为下一轮准备。
到了最后,只剩下一组比赛(决赛),把决赛输出就行了。
我的代码如下:
import java.util.Scanner; public class Two { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 查看n是2的几次幂 int count = 0; int mi = 1; while (mi != n) { mi *= 2; count++; } // 生成队伍名 String[] peers1 = new String[n]; for (int i = 0; i < n; i++) { peers1[i] = i + 1 + ""; } // 生成比赛配对 for (int i = 0; i < count; i++) { String[] peers2 = new String[n / 2]; int start = 0, end = n - 1; for (int j = 0; j < n / 2; j++) { peers2[j] = "(" + peers1[start++] + "," + peers1[end--] + ")"; peers1[j] = peers2[j]; } n /= 2; } System.out.println(peers1[0]); } }
3.上市
输入K,M。其中K代表允许启动的项目数,M代表启动资金。
再输入净利率列表profits,代表一系列项目(数组下标就是项目号)的净利率,非负数。项目数大于K
最后输入启动资金列表capital,代表一系列项目所需的启动资金。非负数
要求输出:把K个项目启动之后,能获得的最大启动资金。
例如
输入:
2 0 1,2,3 0,1,1里面一共有3个项目,只能启动2个。
启动资金是0,只能先启动第1个项目,获得净利率1,纳入启动资金=1,很显然,接下来应该启动第3个项目,因为第三个净利率高。第三个项目结束之后获得净利率3,加上启动资金1,总共为4。
所以应该输出
4
我的思路很简单,设一个boolean数组project,来标记数组下标对应的项目,然后查找一个净利率最高的,而且启动资金足够用的,遍历K遍。 我的代码如下:
import java.util.Scanner; public class Three { public static void main(String[] args) { // 输入 Scanner scanner = new Scanner(System.in); int K = Integer.parseInt(scanner.nextLine()), M = Integer.parseInt(scanner.nextLine()); String[] str1 = scanner.nextLine().split(","); String[] str2 = scanner.nextLine().split(","); int n = str1.length; // 生成净利率和启动资金列表 int[] profits = new int[n]; int[] capital = new int[n]; // 判断是否启动 boolean[] project = new boolean[n]; // 初始化 for (int i = 0; i < n; i++) { profits[i] = Integer.parseInt(str1[i]); capital[i] = Integer.parseInt(str2[i]); project[i] = false; } // 最大利润 int max_prof = -1, index = 0; for (int i = 0; i < K; i++) { for (int j = 0; j < n; j++) { if (!project[j] && max_prof < profits[j] && M >= capital[j]) { max_prof = profits[j]; index = j; } } if (max_prof != -1) { M += max_prof; // 标记为已启动 project[index] = true; max_prof = -1; } } System.out.println(M); } }