第一次面试字节跳动

作者:Nu11Pointer
出处:https://www.nowcoder.com/discuss/155740

=============================================================================
本人南京某985渣渣研究生一枚,生平第一次面试。。。说出来你们可能不信
虽然基本上是GG的节奏,还是写下这个帖子来记录一下吧,大家也可以参考一下。

真心喜欢“字节跳动”这个名字。。觉得好。。Q?
楼主前几天投了字节后台的实习岗位,第二天HR就打电话说安排面试了,视频面试约定在了下午五点,是真的准时,说5点就五点??
在网上看了看大家的面经之后准备了一天就开始了第一轮面试;

一面:

三次面试的小哥哥都是挺友好的,这也是我能平静下来的原因(一开始的时候是真的紧张呀)
一上来就自我介绍,然后介绍自己的项目。bulabulabula 我做了XXX系统!!我完成了xxx功能!

介绍完开始问问题:

  • 问:你之前做的安卓,安卓和Java有什么区别或者相同的地方吗?你的SDK多少版本?JDK呢?
    答:安卓开发用的是SDK,就像Java的JDK一样,可以自己编写,相互调用实现。
  • 问:JVM内存模型了解过吗?介绍一下?
    答:java内存模型分为堆内存和栈内存,栈内存的话保存一些方法传递的参数和一些局部变量。堆内存的话分为新生代和老年代,新生代又分为eden区和两个survivor区 bulabulabula。。
  • 问:新生代和老年代可以转换吗?
    答:可以转换,一般来说new一个变量的话都是进入新生代的eden区,但是会有动态对象年龄判定 和长期存活的对象就会进入老年代。继续bulabulabula
  • 问:这些内存里面的垃圾怎么回收?
    答:有引用计数和可达性分析法。回收算法的话就有垃圾收集算法:标记-清除、复制、标记-整理、分代收集
  • 问:怎么判断是垃圾?GCroot可以为哪些?
    答:a. java虚拟机栈(栈帧中的本地变量表)中的引用的对象。
    b.方法区中的类静态属性引用的对象。
    c.方法区中的常量引用的对象。
    d.本地方法栈中JNI本地方法的引用对象。
    问:垃圾回收器了解过吗?介绍一下G1?
    答:所有的回收算法都会存在STW问题,G1的话就是对这个问题进行优化,并行回收,用户很难感知。bulabulabula
  • 问:数据结构了解过吗?hashmap底层是怎么实现的?
    答:hashmap的话是数组+链表实现的,通过hash散列化来决定进哪一个数组,如果有的话就“挂”在链表的最后面。bulabulabula
  • 问:hashcode一样怎么办?hashcode和equals的区别?
    答:通过equals方法判断真正的内容。 hashcode和equals的关系如下:
    1、如果两个对象相等(equals),那么他们一定有相同的哈希值(hash code)。
    2、如果两个对象的哈希值相等,那么这两个对象有可能相等也有可能不相等。(需要再通过equals来判断)
  • 问:equals和==的区别?我要比较内容呢?
    答:equals:是用来比较两个对象内部的内容是否相等的。
    :是用来判断两个对象的地址是否相同,即是否是指相同一个对象。
    如果没有重写equals时,是直接用
    判断的
    如果是基本类型和基本型封装,则仍然为比较内容。
  • 问:下面我们来做几道题目吧?
    答:(内心OS 来了来了来了!!!!)好。
    题目一:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
    当时我真的是很慌张!脑子里想的是我会做我会做!可是却是一片空白。深呼吸一下。用递归做了出来。 又问我除了递归怎么做?“那就遍历,每次都比较就行”
    “那为什么不用遍历用递归呢?”“递归写起来简单啊!”
    题目二
    给定一个二叉树,原地将它展开为链表。
    leetcode原题。
    题目三
    给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
    秒了。
    一面结束,说叫我别退,还有一个人。
    “好”
    ====================================================================================

二面:

二面的小哥哥不懂Java 疯狂在问操作系统和底层的实现。。。

  • 问:java导包的过程是怎么样的?
    答:import啊(怀疑自己脑残。章口就莱??

  • 问:java的jar包是源代码吗?
    答:jar包就是一堆.class文件

  • 问:那别人的包你导入,你们的字节码会怎么样?互相影响吗?
    答:不!知!道!(哭了,饶了我这个小菜鸡吧)

  • 问:java的编译是怎么一个过程呢?
    答:java编译器的话经过四个步骤,词义分析,语义分析,语法分析和代码生成。

  • 问:java 的虚函数是怎么样的?
    答:java里面是抽象函数和接口,然后bulabulabula介绍异同;

  • 问:java内存模型是怎么样的?
    答:上同。

  • 问:java内存空间是怎么分配的?
    答:
    一, 对象优先在新生代Eden区分配
    二, 大对象直接进入老年代
    三, 长期存活对象将进入老年代(虚拟机设计了一个对象年龄计数器,该阀值默认为15)
    四, 动态对象年龄判定 如果Survivor区中相同年龄所有对象大小的总和大于Survivor区空间的一半,年龄大于或等于该年龄的对象在Minor GC时将复制至老年代
    五, 空间分配担保 当Minor GC时如果存活对象过多,无法完全放入Survivor区,就会向老年代借用内存存放对象,以完成Minor GC

  • 问:我看你数据库用的比较多,介绍一下mysql的底层实现?
    答:底层的话是用b+树实现的,它的优点是能够定位到数据点和范围查询。修改key与子树的组织逻辑,将索引访问都落到叶子节点并 按顺序将叶子节点串起来(方便范围查询) 等等。。。

  • 问:TCP和UDP有什么区别?
    答:
     TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的
     TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
     TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
     TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率
     TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。
     TCP面向的是字节流的服务,UDP面向的是报文的服务。

  • 问:我们做题吧?
    答:(内心OS 来了来了来了!!!!)好。

二面的话就做了一道题目,可能是小哥哥比较急着吃饭吧。QAQ

  • 问:合并两个有序链表。递归和非递归的实现。
    答:(还好还好)秒了。

然后问了我一些基本情况,江苏的吧?问我有没有什么问他的?我:“emmmm 我都忘了我问的啥了”
老哥听完来了句“那就来吧”
内心温暖度maxXXXXXXXXX

问了下上司,要不要三面,上司在吃晚饭,决定晚上八点继续

三面

三面的话就聊人生、聊项目

  • 让我写了一下之前做的socket传输功能服务器端和客户端大概的方法、代码。
  • 然后问了一个架构题目,好像是微博热门怎么查之类的。
  • 没怎么听懂他的意思,Q_Q应该就是一个TopK问题吧。

然后就让我等HR通知了。
5555
总体感觉的话还是要学的东西还挺多的,要不然以后心态还是会崩,会做的题差点因为紧张而得不到正常发挥。
感谢字节跳动给我面试的机会吧,不论最后有没有成,我还是要说,“字节跳动”这个名字真的好Q啊
觉得文章不错的欢迎关注我的WX公众号:程序员乔戈里
我是百度后台开发工程师,哈工大计算机本硕,专注分享技术干货/编程资源/求职面试/成长感悟等,关注送3000G编程资源,免费下载优快云资源。

<think>首先,用户的问题是关于字节跳动面试时需要手写代码的题目。用户说:“我想获取字节跳动面试时需要手写代码的题目”,意思是“我想获取字节跳动面试时需要手写代码的题目”。 我有几个引用参考: - 引用[1]:这是一个C++解决方案,用于求子集(不含有重复数字)。代码是解决子集问题的回溯算法。 - 引用[2]:这是一个面试经验分享,提到了面试失败,但没有具体代码题目。主要是建议和复盘。 - 引用[3]:提到了字节跳动的Java面试题,包括手写代码和设计题,但具体题目没有给出。只提到前三面表现还行,算法题做出来了。 - 引用[4]:这是一个Java代码,用于解决最长公共前缀的问题("longestCommonPrefix")。输入是字符串数组,输出是公有前缀。 用户的要求是“获取字节跳动面试时需要手写代码的题目”,所以我需要提供一些常见的题目类型或示例。 从引用中,我可以提取出一些题目: 1. 从引用[1]:求子集问题(子集问题),给定一个不含有重复数字的数组,返回所有子集。 2. 从引用[4]:最长公共前缀问题,给定字符串数组,找到所有字符串的最长公有前缀。 这些都是算法题,通常在面试中手写代码。 此外,用户提到了“字节跳动面试算法题目以及答案”,所以我可以基于这些提供更多的例子。 由于用户要求生成相关问题,我需要根据指令: - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 生成相关问题。 系统级指令: - 所有行内数学表达式使用$...$。 - 独立公式使用$$...$$。 - 使用中文回答。 - 生成相关问题。 在用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 用户上一次的问题和我的回答:用户的问题是新问题,没有历史上下文。用户说“参考站内引用”,但这些引用是提供的上下文。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,用户上一次的问题是什么?在系统消息中,用户的问题是关于字节跳动面试手写代码题目的。 回顾对话历史: - 系统消息定义了规则。 - 用户消息是查询字节跳动面试手写代码题目。 所以,我需要基于引用和常见知识来回答。 结构化回答: 1. **介绍**:解释字节跳动面试中常见的代码题目类型。 2. **提供示例题目**:基于引用给出题目。 3. **给出代码示例**:如果可能,简要展示代码。 4. **添加引用标识**:在引用来源的地方添加[^n]。 5. **生成相关问题**:在结束时,列出相关问题。 常见字节跳动面试算法题(基于我的知识): - 子集问题(引用[1])。 - 最长公共前缀(引用[4])。 - 其他常见题如:反转链表、二叉树遍历、动态规划问题等。 基于引用: - 引用[1]:子集问题。 - 引用[4]:最长公共前缀问题。 - 引用[3]提到有手写代码题,但未指定。 所以,我可以重点在引用中提供的题目。 生成相关问题: - 例如: 1. 如何解决子集问题? 2. 最长公共前缀的优化方法? 3. 字节跳动面试还常考哪些算法题? 回答结构: - 先直接回答用户查询。 - 然后提供示例。 - 最后相关问题。 确保中文。 </think>### 字节跳动面试手写代码题目概述 字节跳动面试中,手写代码题目通常聚焦于算法与数据结构,测试候选人的编程能力、问题解决技巧和代码优化能力。这些题目大多来自LeetCode或类似平台的常见问题,涵盖数组、字符串、链表、树、动态规划等核心主题。基于您提供的引用内容(特别是引用[1]和引用[4]),我整理了两个具体示例题目及其解决方案。这些题目在字节跳动面试中出现频率较高,常作为筛选环节的关键考核点[^1][^4]。 #### 1. 子集问题(不含有重复数字) **题目描述**:给定一个不包含重复数字的整数数组,编写一个函数返回该数组的所有子集(幂集)。子集不能包含重复元素,且顺序不限。 **输入示例**:$nums = [1,2,3]$ **输出要求**:返回所有子集,例如 $[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]$。 **解决方案思路**:使用回溯算法(深度优先搜索)递归生成子集。每一步选择是否添加当前元素,并维护路径列表。 **代码示例(C++)**(基于引用[1]的解决方案): ```cpp #include <vector> using namespace std; class Solution { public: vector<vector<int>> res; // 存储结果 vector<int> path; // 当前路径(子集) void backtracking(vector<int>& nums, int startIndex) { res.push_back(path); // 添加当前路径到结果 for (int i = startIndex; i < nums.size(); i++) { path.push_back(nums[i]); // 选择当前元素 backtracking(nums, i + 1); // 递归处理剩余元素 path.pop_back(); // 回溯,撤销选择 } } vector<vector<int>> subsets(vector<int>& nums) { backtracking(nums, 0); // 从索引0开始 return res; } }; ``` **关键点分析**:时间复杂度为$O(2^n)$(n为数组长度),空间复杂度为$O(n)$。回溯法高效处理组合问题,面试中常考察代码的边界条件和优化思路[^1]。 #### 2. 最长公共前缀问题 **题目描述**:给定一个字符串数组,编写一个函数找到数组中所有字符串的最长公共前缀。如果没有公共前缀,返回空字符串。 **输入示例**:$strs = ["dog","racecar","car"]$ **输出要求**:返回公有前缀,例如$""$(空字符串)。 **解决方案思路**:先对字符串数组排序,然后比较第一个和最后一个字符串的公有字符序列。排序后,公共前缀由首尾字符串决定,简化比较过程。 **代码示例(Java)**(基于引用[4]的解决方案): ```java import java.util.Arrays; class Solution { public String longestCommonPrefix(String[] strs) { int n = strs.length; if (n == 0) return ""; Arrays.sort(strs); // 排序数组 int minLen = Math.min(strs[0].length(), strs[n-1].length()); // 取首尾字符串的最小长度 StringBuilder sb = new StringBuilder(); for (int i = 0; i < minLen; i++) { if (strs[0].charAt(i) == strs[n-1].charAt(i)) { sb.append(strs[0].charAt(i)); // 添加公有字符 } else { break; // 发现不一致则终止 } } return sb.toString(); } } ``` **关键点分析**:时间复杂度为$O(n \log n)$(主要开销在排序),空间复杂度为$O(1)$。该方法高效且易于实现,面试中常考察字符串处理技巧和边界条件(如空数组处理)[^4]。 ### 其他常见字节跳动面试手写代码题目 基于面试经验和引用内容,字节跳动面试中手写代码题目还包括以下类型(未在引用中直接给出,但属于高频考点): - **链表操作**:如反转链表、检测环等。题目举例:给定一个单链表,原地反转并返回新头节点。 - **二叉树遍历**:如二叉树的深度优先搜索(DFS)或广度优先搜索(BFS)。题目举例:实现二叉树的层序遍历。 - **动态规划问题**:如背包问题或最长递增子序列。题目举例:给定数组,求最长连续子序列和。 - **排序与搜索算法**:如实现快速排序或二分查找(引用[3]间接提到算法题做出来,暗示其常见性)。 这些题目旨在评估基础算法能力和编码习惯。面试中,建议优先处理时间复杂度最优的解法,并讨论边界情况(如空输入或大输入规模)。准备时,可参考LeetCode或《剑指Offer》等资源加强练习[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值