logo

6.9 小公司要求真高

作者
Modified on
Reading time
5 分钟阅读:..评论:..

https://www.nowcoder.com/feed/main/detail/6d73c0bef74a4ea6bd2d68ce7cd0e9b4

大家好,我是白露啊。

最近看到一个爽文帖,标题就是——“小公司要求真高”。

事情是这样的,一家的小公司在拿到简历之后,HR直接对楼主说:“你不合适,简历不行。” 言外之意就是嫌弃简历单薄,看不上楼主。

万万没想到。。。

然后还扎心的来了一句:“你们班或者年级,有没有合适的同学可以推荐?”

WTF?

你看不上我,我又不是你公司的人,还得帮你推荐?你这是打什么算盘🧮啊!

怎料楼主立马以迅雷不及掩耳之势,甩了一个腾讯录取的图片。腾讯PCG,大家都知道那绝对是个重量级部门。

瞬间打脸,秒变爽文,网友纷纷惊呼。

还有之前面过这个家公司的网友也开始吐槽:

看来,天下“苦秦”久矣。。。

各位小伙伴们,求职之路虽然充满荆棘和挑战,但请保持自信、积极,努力学习。都能像楼主一样,最终迎来“大鹏展翅”的那一刻。期待看到你们更多的精彩故事和真实体验,欢迎在评论区分享。好了,今天我们来看一篇外企Shoppe 的面试,如果不想看,可以直接跳转到文末,有惊喜哦~

开始面试

面试官: 首先请做一下自我介绍。

求职者: 您好!非常感谢有这个机会参加Shopee的面试。我是一名软件工程专业的毕业生,对后端开发非常感兴趣。我有扎实的计算机科学基础,熟悉Java和Python等编程语言,也对分布式系统和网络通信有一定的了解。在我的实习经历中,我参与了多个后端项目,包括API开发和数据库优化等。

面试官: 谈谈进程和线程的区别?为什么线程切换消耗资源小?它们是如何来使用多核CPU的?

求职者: 进程是操作系统资源分配的基本单位,每个进程都有自己独立的地址空间和资源。线程是进程中的执行单元,是CPU调度的基本单位,一个进程可以包含多个线程,线程之间共享进程的资源,如内存和文件描述符。线程切换消耗资源小是因为线程间共享部分状态,切换时不需要重新加载地址空间。在多核CPU上,操作系统可以将不同的进程或线程分配到不同的核心上并行运行,以此提高执行效率。

面试官: 虚拟内存是什么?

求职者: 虚拟内存是计算机系统内存管理的一种技术。它允许程序在运行时拥有一致的地址空间,这个地址空间通常会比物理内存大。它利用磁盘空间来扩展可用内存,通过内存分页和页表来管理。这样,即使物理内存被占用完,程序仍然可以继续运行。

面试官: 描述一下手机下单流程的网络请求过程?为什么是三次握手不能是两次?世界上这么多机器是怎么知道我们的目标服务器在哪里?

求职者: 当手机发起下单请求时,会经过应用层、传输层、网络层、链路层的多个步骤。三次握手是TCP/IP协议确保稳定连接的一种机制,它通过三步验证双方都准备好进行数据传输。两次握手不能确认双方的接收与发送能力都是正常的。网络请求通过DNS解析域名找到目标服务器的IP地址,然后通过路由器根据IP地址来确定数据包的转发路径。不是通过MAC地址匹配,MAC地址通常只在同一局域网内有效。

面试官: 连接断开过程是怎样的?没有第四步会怎么样?TCP和UDP的区别?

求职者: TCP连接的断开是一个四次挥手的过程,确保双方都没有数据再发送。如果没有第四步,就可能导致一方仍然等待关闭,从而造成资源的浪费。TCP是面向连接的协议,提供可靠的数据传输,而UDP是无连接的,提供快速但不保证可靠性的数据传输。

面试官: HashMap的实现?红黑树的好处?

求职者: HashMap是基于哈希表的数据结构,通过计算键的哈希码来存储和检索键值对。在Java中,当HashMap中的某个桶里的元素过多时,会将链表转换为红黑树,以提高搜索效率。红黑树是一种自平衡的二叉搜索树,它能在O(log n)的时间复杂度内完成查找、插入和删除操作,即使在最坏情况下也能保持较好的性能。

面试官: 来,写道题吧:两两一组翻转链表

求职者: 要两两翻转链表,我们可以使用迭代的方法。我们遍历链表,每次取出两个节点,并在局部进行翻转,然后将翻转后的子链表重新连接到主链表上。我们还需要一个指针来跟踪上一对翻转后的节点,以确保链表的完整性。

面试官: 现在,请你尝试写出两两一组翻转链表的代码,并分析时间复杂度。

求职者: 好的。这是两两翻转链表的一个可能的Java实现:

class Solution { public ListNode swapPairs(ListNode head) { ListNode dummy = new ListNode(-1); dummy.next = head; ListNode prevNode = dummy; while (head != null && head.next != null) { ListNode firstNode = head; ListNode secondNode = head.next; prevNode.next = secondNode; firstNode.next = secondNode.next; secondNode.next = firstNode; prevNode = firstNode; head = firstNode.next; // jump to the next pair } return dummy.next; } }

这段代码的时间复杂度是O(n),其中n是链表中的节点数量,因为我们需要遍历整个链表来两两翻转节点。