标签题目
数组相关面试题
手写题:数组去重,用多种方式实现
这题考察数组去重的多种实现、相等判断和复杂度边界。高质量回答要覆盖基本类型、NaN、对象引用和对象数组按业务 key 去重。
手撕:数组拉平(flatten)
这题考察递归遍历、depth 语义、顺序保持和边界处理。回答时要先约定函数契约,再写出不会丢类型的实现,并说明深层数组时的栈风险。
filter、map、reduce 的性能和区别是什么?
这题考察数组高阶函数的语义、返回值、遍历成本和可读性取舍。先讲用途差异,再谈性能,避免把所有问题都归结为 reduce 更强。
数组常用的 API,哪些能改变原数组?
这题考察数组 API 的可变性和返回值语义。回答时按会修改原数组、返回新数组、只读取查询三类整理,并强调 sort、reverse、splice 是高频坑。
数组和链表、队列和栈有什么区别?
数组和链表是两种底层线性存储结构,差异主要体现在内存布局、随机访问、插入删除、缓存局部性和扩容成本。队列和栈是两种抽象数据类型,差异主要体现在访问顺序和操作约束:队列先进先出,栈后进先出。高质量回答要把这两层概念分开:数组和链表是实现材料,队列和栈是使用规则,队列和栈都可以用数组或链表实现。
给定数组指针,如何访问第 50 个元素?
这道题考察的是数组下标、指针运算和数组指针类型的边界理解。核心回答应先澄清“第50位”通常指第50个元素,因此数组从 0 开始计数时应访问 arr[49],若给的是首元素指针则写成 *(p + 49)。如果题目说的是下标 50,则对应 arr[50],也就是第 51 个元素。
只能买卖一次时,如何计算股票最大收益?
一次买卖股票最大收益的核心是维护历史最低买入价,并在每一天尝试把当天价格作为卖出价更新最大利润。
给定整数数组,如何求和为 m 且长度最短的子数组长度?
求和为 m 的最短连续子数组要先确认数组元素是否都为正,正数数组可用滑动窗口,含负数时要改用前缀和和哈希结构。
如何实现洗牌算法?
公平洗牌应使用 Fisher-Yates 算法,从后往前随机选择一个未固定位置交换,保证每种排列出现概率相同。
C++的vector跟Java的ArrayList的区别?
C++的vector跟Java的ArrayList的区别?这道腾讯牛客题的关键是围绕“C++ vector 与 Java ArrayList 对比”讲清概念、机制、取舍和边界。C++ vector 和 Java ArrayList 都是动态数组,但 vector 存放的是元素本身并通过模板在编译期确定类型;ArrayList 底层是 Object[] 引用数组,泛型有类型擦除,基本类型需要装箱成对象。