【校招实习面试实战,身临其境】华为软件开发工程师面试复盘总结

备战春招,校招实习面经分享,拿Java开发工程师offer~~

本系列文章包括Java、算法、计算机网络、数据库、操作系统等等,本篇介绍面试华为【软件开发工程师】岗位的题目,复盘解析及心路历程。
在这里插入图片描述

传送门:

  1. 【亲身面经分享,校招实习面试系列】每日10题,快速学习(Java基础篇)
  2. 【校招实习面试系列,每日10题,快速学习】Java高级篇
  3. 【校招实习面试系列】你知道网络中4类IO模型是什么吗?我的朋友如此优秀回答

华为的面试是HR提前跟你约好时间的,而且会在临近面试时间发出信息通知,也可以登录官网看到自己的面试链接。

一般面试官会面试很多人,应聘者在队列中,可以看到自己排到第几位,轮到自己时会再次发信息,点击签到即可,然后就进入面试了。

接下来就介绍面试华为【软件开发工程师】岗位的题目,复盘解析及心路历程,还有一些个人的想法和面试建议。

自我介绍

基本上按简历上写的讲。

一份充实的简历,在自我介绍的时候可以按照简历上的顺序讲,可能有的人觉得写在简历上,面试官可以自己看,自己没必要讲。

其实写的只是干巴巴的描述,而说出来更能体现面试者的态度和表达逻辑。这跟“说”和“做”一样的道理。

1、是否用过Java、Python做系统的项目

自我介绍结束之后,面试官通常会抛出一个问题,这是深究自己做过的项目的开始。

我没有做过很大的项目,写的系统也是自学。自己简单说了一下 🤣

虽然项目不大,但是自学的情况下通常在开发过程中会遇到问题,解决问题,这里可以讲亮点说出来,体现自己的能力和认真。

2、华为云系统开发js写业务逻辑用的是ES6还是ES5标准

之前参加过华为云系统开发获得奖,面试官好像感兴趣,问了这个问题,但是前端的八股文我不太了解 😅

这个问题的来源是简历上写的一个比赛获奖,可以发现,面试官有时会抓住简历上的点来考察,因此写在简历上的东西自己都必须很熟悉。

3、平时熟练使用哪种语言

我说Java,以前学C++有写过题,python也会基本操作 😂

这是一个简单的问题,开放性大,相当于面试官把主动权交给应聘者,让他来展现接下来熟悉的领域。作为应聘者,要抓住机会,引导面试官走向自己的知识体系。

然后得知我熟悉java,后面主要对java内容提问,基本达到目的 😁

4、HashMap、HashSet、HashTable、StringBuffer、StringBuilder哪些是线程安全,哪些是线程不安全

线程安全:HashTable、StringBuffer

线程不安全:HashMap、HashSet、StringBuilder

这些都是实际中常用的数据结构,应当非常熟悉。

表面上是一个选择题,实际回答可以讲讲内部数据结构,为何线程安全,从底层讲解,凸显自己的基础功底。

5、HashSet数据结构,跟HashMap有什么区别

HashMap底层由数组和链表两种数据结构实现,JDK8时候,在优化方面增加了链表转化为红黑树的方法,目的提高查找效率。

HashSet底层其实就是一个HashMap,存储key,value内容相同。

抛出这个问题,目的就是问题的深度增加,考察基础的扎实程度,对于一个问题,有没有去深入了解内部信息,或者只停留在表面,此时可以让应聘者无所遁形。

6、Java集合框架的主类是什么,HashSet有没有继承Collection

众所周知,Java集合的主类就是Collection,且List、Set这些都是继承Collection的。

同样的道理,这个问题表面只是简单的问答题,实际我们可以展现出对Java集合框架这个基础知识的扩展,讲讲更丰富的内容

7、软件工程学过哪些课程

同样是开放性问题,与第3题一样,我们学过很多课程,有些掌握不太好,比如操作系统!这时就引导面试官走向自己熟悉的课程,避坑!

8、进程和线程的区别

进程:资源分配和调度的单位,是一个程序的主体。

线程:进程内一个相对独立的执行流,处理机分配的实体。进程内部多个并发活动,减少系统对于并发所带来的时空开销,共享资源,建立线程模型

9、知道哪些排序算法,快排的时间复杂度是多少,是稳定的排序算法吗

排序算法,是必须掌握的基础算法!

算法:选择排序、冒泡排序、插入排序、快速排序、希尔排序、堆排序。

快速排序时间复杂度:最好O(nlogn),最坏O(n^2)

快速排序不是稳定排序算法。

排序算法网上的各种讲解十分丰富,这里不再赘述。

10、编程题/算法

面试官通常会考察编码能力或者算法,于是出了一道题。

题目大概:请输出两个字符串a和b相减的结果(a>b,a和b的字符串长度介于1~50之间)。
例:输入a:“99999”,b=“99998”
输出:“1”

看了题目,做过的一目了然,没做过的一脸懵,因此很看运气。这就是经典的大数相减问题

方法源码

import java.io.Serializable;

public class bigNumbersSub implements Serializable {

    private static final long serialVersionUID = 4166471447559104817L;

    /**
     * @author Charzous
     * 
     * 两个正大数相减
     */
    public static String twoBigNumbersSub(String num1, String num2) {
        int len1 = num1.length(), len2 = num2.length();
        int i, j;
        int maxLen = Math.max(len1, len2);
        int[] n1 = new int[maxLen];
        int[] n2 = new int[maxLen];
        //反转存储
        for (i = 0; i < len1; i++) {
            n1[i] = num1.charAt(len1 - i - 1) - '0';
        }
        for (i = 0; i < len2; i++) {
            n2[i] = num2.charAt(len2 - i - 1) - '0';
        }
        //确定最终结果符号位
        char sign = '+';
        if (len1 < len2)
            sign = '-';
        else if (len1 == len2) {
            int idx = len1 - 1;
            // 从后往前比较每一位,确定符号
            while (idx > 0 && num1.charAt(idx) == num2.charAt(idx)) {
                idx--;
            }
            if (num1.charAt(idx) < num2.charAt(idx))
                sign = '-';
        }

        int[] result = new int[maxLen];
        //逐位计算得到结果
        for (i = 0; i < maxLen; i++) {
            if (sign == '+')
                result[i] = n1[i] - n2[i];
            else
                result[i] = n2[i] - n1[i];
        }

        for (i = 0; i < maxLen - 1; i++) {
            //如果该位数小于0,需要向前借位
            if (result[i] < 0) {
                result[i] += 10;
                result[i + 1] -= 1;
            }
        }
        StringBuilder ans = new StringBuilder();
        //再次反转,得到结果
        for (i = maxLen - 1; i >= 0; i--) {
            ans.append(result[i]);
        }
        j = 0;
        //去除前导0
        while (j < ans.length() && ans.charAt(j) == '0') {
            j++;
        }
        ans.replace(0, j, "");
        //相等
        if (ans.toString().equals(""))
            return "0";
        else if (sign == '-')
            ans.insert(0, '-');
        return ans.toString();
    }

    /**
     * @author Charzous
     * 
     * 两个正大数相减,且 a > b
     */
    public static void main(String[] args) {
        String num1 = "10903903163681";
        String num2 = "10000090102090";
        System.out.println(twoBigNumbersSub(num1, num2));
        System.out.println();
        System.out.println(Long.parseLong(num1) - Long.parseLong(num2));
    }
}

大数相减在实际编码主要重于技巧,在设计上需要花心思,可以从上面代码中清晰看到每个步骤的逻辑,容易理解。

回顾这轮面试得复盘,发现掌握基础的重要性,以及对问题的剖析程度,校招实习面试更看重基础能力



欢迎“一键三连”哦,点赞加关注,收藏不迷路!

每天进步亿点点,距离Java工程师更近一步啦,我们下篇见!(⊙ᗜ⊙)

公众号同步更新哦,习惯阅读公众号的伙伴们可以关注下面我的公众号呀!


本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/123293682

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆海潘江小C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值