ohmyblog

#算法

经典题解析:正整数变 1 的最少操作次数,贪心为什么成立

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料,与任何公司的当前招聘无关。题面很短:给一个正整数 n,每一步如果 n 是偶数就除以 2,如果是奇数可以选择加 1 或减 1,一直处理下去,问最少多少步能变成 1。

经典题解析:设计一个最大频率栈,push 和 pop 都要快

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料,与任何公司的当前招聘无关。「最大频率栈」是数据结构设计题的代表:push 照常压栈,pop 弹出的不是最后压入的,而是当前出现次数最多的元素;次数并列时,弹出这些元素里最近压入的那个。要求 push 和 pop 都足够快。

经典题解析:二叉搜索树找第 K 小,中序遍历还能再优化吗

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料,与任何公司的当前招聘无关。「二叉搜索树中找第 K 小的节点」是树结构面试的高频题——基础解法人尽皆知,区分度全在追问里:还能再快吗?代价是什么?

经典题解析:逆序输出一个单向链表,只能遍历一次怎么办

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料,与任何公司的当前招聘无关。链表逆序输出是链表题里的「入门天花板」——题面一句话,但能一口气问出递归、栈、迭代、边界条件一整串考点。

经典题解析:KMP 的 next 数组到底在记什么,一次讲明白

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料(见文末来源说明),与任何公司的当前招聘无关。KMP 是字符串匹配的经典算法,面试官几乎不问「你会不会背」,问的是「next 数组里存的到底是什么」。

经典题解析:找数组里第 K 大的数,排序之后再取就慢了

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料(见文末来源说明),与任何公司的当前招聘无关。「数组里第 K 大的元素」几乎人人都会第一反应「排序再取」,面试官真正想听的是后半句:能不能不排完?

经典题解析:数组里出现次数过半的数,O(n) 时间 O(1) 空间怎么做到

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料(见文末来源说明),与任何公司的当前招聘无关。「找数组中出现次数超过一半的元素」这道题,几乎人人都能答出哈希计数,面试官真正想听的是那句进阶要求:O(n) 时间、O(1) 空间,怎么做?

经典题解析:判断链表有环只是第一步,环的入口怎么找

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料(见文末来源说明),与任何公司的当前招聘无关。「判断链表是否有环」几乎人人会答,面试官真正想听的是后半句:环的入口节点是哪一个?以及为什么这样做是对的。

经典题解析:两数之和,为什么哈希表能把 O(n²) 变成 O(n)

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料(见文末来源说明),与任何公司的当前招聘无关。「两数之和」大概是算法面试里出现频率最高的入门题,但它真正的考点不是会不会做,而是能不能讲清楚复杂度从 O(n²) 降到 O(n) 的那一步是怎么发生的。

50 万个点 1 秒内找出所有「最大点」:这道经典题考的不是代码,是复杂度直觉

想象面试后半程,面试官在屏幕上敲出一道题:平面上给 N 个点,如果不存在另一个点的横、纵坐标都严格比它大,就称它为「最大点」。请输出所有最大点,按横坐标从小到大排列。数据范围:N 最大 50 万,坐标是 0 到 10 亿之间的整数且互不重复,时间限制 1 秒。