首页 > 华为数字化IT应用工程师 信息技术工程部 笔试面试经历(凉)
头像
Bluesky201810251749696
编辑于 2021-04-04 10:12
+ 关注

华为数字化IT应用工程师 信息技术工程部 笔试面试经历(凉)

=====================分割线==========================
3/22更新
刚写完帖子就出结果了

感觉是性格方面的吧。
我面试的时候挺紧张的,话也说不好。
面试官问我性格的时候,我实话实说我比较内向。
还有最后那个问题的回答,回答虽然很诚实,但是表现得功利性太强了。
说实话我没看帖子,也没提前准备,华为喜欢考字符串是同学告诉我的。而我却回答了针对性看一些帖子,看看华为比较喜欢考什么。🤣
=====================分割线==========================
3/22更新
主管面来了,刚面完就来写帖子。

主管面

主管面本来是约了20日18点的,后来公司打电话推迟到今天了。
先说一下面试官,我感觉面试官跟一面的长得一模一样。(一面的时候,面试官那边信号不好,把视频关了)
先自我介绍。
面试官问了我项目,项目的角色,我的成绩排名,你最紧张的一件事是什么,最有成就感的一件事,你对于成就感的定义是什么。
你的性格是怎么样的。你的最好的朋友是谁,你最讨厌的一个人是谁。你大学参加了什么活动。你有一件事情,你的计划是什么。
在大学期间你感觉你比别人努力吗。你上大学时候的目标是什么?
反问环节:
1.华为员工的一个成长历程是怎么样的?
面试官:首先有两周的一个文化体验,然后有导师带,六个月后转正答辩。
2.华为的部门之间有壁垒吗?
面试官:基层这边的话,基本上是比较开放的。
最后面试官补充问了一个问题,你笔试成绩不错,是有什么诀窍吗?
我:笔试之前,我会针对性看一些帖子,看看华为比较喜欢考什么。
然后就886。
最后许愿一个offer
=====================分割线==========================
3/20更新
今天11点半进行了一面,面了一个多小时,紧接着2点进行了二面,差不多有50分钟。
先说一下一面

一面

先自我介绍,然后说我在大学学了什么课,然后介绍自己参加的比赛项目。
然后面试官问了我大学成绩排名,GPI,四六级,大学参加了什么活动社团之类的。
然后就问基础了。
面试官:说一下接口和抽象类的区别。
这个问题答案大家自行网上搜。
面试官:说一下Cookie和Session有什么区别。
面试官:说一下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);
    }
}






全部评论

(18) 回帖
加载中...
话题 回帖

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐