
s4: 数据结构/算法
涛歌依旧
毕业后就职于华为和腾讯
展开
-
快速排序的一种高雅写法
最近看源码,发现了一段快速排序的代码,挺有意思,一起来看看:原创 2022-06-12 22:38:34 · 876 阅读 · 2 评论 -
数据结构真的没用吗?
最近跟一个人聊天,聊了几句,就感觉没啥意思了,他的意思是:数据结构和算法没啥用,仅仅笔试面试才有用,工作中完全用不到。我还能说啥呢?最近看Redis源码,随便甩一段出来看看:/* Add a new node to the list, to tail, containing the specified 'value' * pointer as value. * * On error, NULL is returned and no operation is performed (i.e. t原创 2022-05-15 23:00:59 · 1940 阅读 · 6 评论 -
腾讯面试:你会求二进制中1的个数吗?
大家好,我是涛哥。今天,我们来看一道腾讯面试题:已知n是一个非负整数,求其二进制中1的个数,要求算法效率尽可能高。这个题目具体什么意思呢?我们假定n = 20,则其二进制为:10100,那么二进制中为1的个数是2个。这道题看似极其简单,但要找到高效的算法并非易事。接下来,我们循序渐进地看具体解法,并做扩展练习。 腾讯滨海大厦夜景常规解法我们可以直接求出n的二进制值...原创 2022-03-13 23:02:32 · 2009 阅读 · 5 评论 -
最近在学习各种各样的数据库,发现只懂Mysql根本不行
最近在学习各种各样的数据库,发现只懂Mysql根本不行。Mysql相信大家都不陌生,要想深入的学习也是要花大力气。每个语言都有不同的适用场景,也很难说有一种是万能的。现在工作中面对千差万别,数据量也非常的庞大,只懂Mysql短期内也许可以应付一二,但不是长久之计。...原创 2021-11-15 22:23:20 · 944 阅读 · 0 评论 -
二叉树中,叶子结点个数怎么求?
最近有读者问我关于二叉树叶子节点个数的问题。这个问题一般也是比较偏基础的面试题目,很简单啦。直接代码,我们一起来再来学习一下:#include<iostream>#define N 63using namespace std;char str[] = "ab#d##c#e##";int i = -1;typedef struct node{ struct node *leftChild; struct node *rightChild; char data;}原创 2021-10-18 22:58:28 · 3756 阅读 · 0 评论 -
字节面试:编辑距离该怎么求?
大家好,我是涛哥。又是周末,过去的几天工作日,可能你会忙得焦头乱额,但毕竟是充实的,忙碌才是生活和工作的常态,也值得欣慰。今天,我们来聊一个经典的面试题:编辑距离。无论是面试字节跳动、腾讯还是阿里,编辑距离必须掌握,且要熟练写出代码。 涛哥手绘(老虎与猫的编辑距离)一. 编辑距离简介编辑距离,可以用于度量两个字符串的差异。其含义是:一个字符串到另一个字符串的最少变换次数,其中,变换操作仅涉及...原创 2021-08-28 20:54:24 · 1715 阅读 · 4 评论 -
笔试面试题目:平衡二叉树的判断
学如逆水行舟,不进则退。心如平原野马,易放难收。春节假期,基本结束,是该回归正常的节奏了。生活和工作,需要平衡。紧张和松弛,亦需平衡。今天,我们来聊一个笔试面试题目:平衡二叉树的判断。这个问题很简单,写点代码玩一下,一来是找回代码的感觉,二来是找回工作状态的感觉,经leetcode测试无误。原创 2021-02-28 18:40:20 · 2907 阅读 · 0 评论 -
笔试面试题目:求逃跑的猪猪们
腾讯、阿里、字节跳动的面试题,很难当场想出解法。所以,题还是要刷。刷题比刷抖音有趣多了,能培养和拓展思维,预防脑袋生锈。最后,希望大家在刷题中,找到乐趣,你会感叹原来还能这样啊,顺便地,能拿到更好的offer,工资翻倍,福利多多,祝大家面试顺利。原创 2021-02-21 20:11:42 · 2668 阅读 · 0 评论 -
笔试面试题目:单链表的就地反转
当年,在腾讯的校招面试中,我遇到了这个问题,记得当时写得并不好,加上面试官一再追问,我慌了,结果很尴尬。去年,在松山湖的一个饭局上,和业界Android某大佬聊天,他说自己去字节跳动面试,被要求写单链表的就地反转,没有写对。他可是写了好几本Android核心书籍啊,居然被这个问题给卡住了,确实大大出乎我的意料。原创 2021-02-21 20:08:21 · 1961 阅读 · 0 评论 -
笔试面试题目:对称树的判断
周六,被外面的施工给吵醒了,以往没这种情况啊,不知道他们在干啥。今天,我们来聊一下对称树的判断。 这些年来,我不断地忽悠朋友们去BATH, 促进人才流动,自己也能顺便获取一些好处。 S哥便是我忽悠的目标之一,S哥是某985土木工程专业出身,后来转行做了程序员,去T公司面试,碰到这样一道题目(一看就是leetcode中的easy级别问题): 我们来分析一下这个问题,如下图所示,假定root...原创 2020-12-01 08:31:04 · 3193 阅读 · 10 评论 -
笔试面试题目:编辑距离
编辑距离,可以用于度量两个字符串的差异。其含义是:一个字符串到另一个字符串的最少变换次数,其中,变换操作仅涉及增删改,且每次只能操作一个字符。 编辑距离的应用很广,比如纠错检错: 编辑距离,在笔试面试中会经常涉及到。一朋友最近参加了T公司的面试,便遇到了编辑距离: 编辑距离,是一个典型的动态规划问题。那么,从一个字符串到另一个字符串的编辑距离一定存在吗?这是必然的,暴力方...原创 2020-12-01 08:16:25 · 1945 阅读 · 2 评论 -
笔试面试题目:青蛙跳台与斐波那契数列
今天周末,刚好也是程序员节,来聊一下青蛙跳台与斐波那契数列。很多年前,我在面试T公司的W部门时,遇到了青蛙跳台问题。 问题如下: 有n阶台阶,青蛙每次只能跳跃1阶或2阶,求跳上n阶台阶的方法数。 (1)当n > 1000时,写程序求解。 (2) 求通项公式。 不得不说,要在面试现场解决这个问题,还是有一定难度的。记f(n)为青蛙跳上n阶台阶的方法数,则有:...原创 2020-12-01 08:11:27 · 2759 阅读 · 8 评论 -
笔试面试题目:盛水最多的容器
今天周末,来看G公司的一道面试题: 求max{|i-j|*min{a[i], a[j]}}的值,其中a是正整数数组,i和j的区间为[0, n-1]. 这其实就是leetcode中的“盛水最多的容器”,如下: 鲁迅说:暴力可以解决一切问题。 胡适说:暴力能解决的问题,都不是问题。 因为i和j的可能性是有限组合,所以暴力算法能得到结果,但无法通过面试。 用...原创 2020-11-07 11:04:53 · 4785 阅读 · 16 评论 -
笔试面试题目:求缺失的最小正整数
国庆假期已过半。今天,我们来看一个leetcode问题,也是当年B公司的面试题,有难度。问题如下: 给定一个整数数组,找出其中缺失的最小的正整数,要求时间复杂度为O(n), 空间复杂度为O(1). 输入输出示例如下:输入数组a 输出 [1, 2, 0] 3 [3, 4, 1, -1] 2 [6, 7, 8, 12] 1 我们先来分析一下: A. 假设a中的n个元素占...原创 2020-11-07 11:00:47 · 3282 阅读 · 9 评论 -
0/1背包问题与最大收益
池塘的水满了,雨也停了,田边的稀泥里到处是泥鳅。 不过,今天不捉泥鳅,而是去捉螃蟹,待会儿太阳小点就出发。拿个袋子,当然是捉得越多越好,于是想到类似的经典问题: 小偷夜入宝地,可偷宝贝甚多,然背包承重有限,最大收益几何? 这是一个典型的0/1背包问题,为什么叫0/1背包问题呢?因为对于一件宝贝,小偷要么选择偷它,要么选择不偷它。小偷陷入了左右为难的境地,我们对小偷的困难进行分析和具体化。 ...原创 2020-11-07 10:56:38 · 2800 阅读 · 6 评论 -
笔试面试题目:求丢失的猪
今天国庆,也是中秋,实在难得。在21世纪的100年内,仅有4年是这样的。今天在家里,陪家人,做饭吃,干家务活,看点闲书,顺便写点东西,待会出去逛逛,然后回来跑跑步。 校园秋招陆续开始了,祝在校同学拿到心仪的offer,也祝社招的同学跳槽顺利。 今天,我们来看下A公司的一个面试题: 有n只猪,用车拉到菜市场去卖,这群猪的身上分别贴了1~n的编号,突然,有一只猪从车上跳下溜走了,求溜走的猪的编号。 ...原创 2020-11-07 10:50:15 · 8169 阅读 · 23 评论 -
笔试面试题目:判断单链表是否有环
之前在U公司的笔试中,碰到这样一个问题: 判断单链表是否有环。 首先来看这样一个常识:现实中的环路与单链表的环路,有什么不同呢? 显然:现实中的环路,可以有两个方向,要么循环,要么逃出。然而,在单链表中,指针next只可能有一个指向,所以环路链表必定永远循环,没有出口。如下图所示: 回到问题本身,怎么判断单链表是否有环呢?算法1:标记法 最容易想到的肯定是标...原创 2020-11-07 10:46:49 · 2170 阅读 · 9 评论 -
一网打尽海量数据面试问题
周末,深圳,又是大雨。今天来聊海量数据。 海量数据,是BAT笔试面试中的常客,TMD也纷纷效仿,其余公司也紧随其后。在实际工作中,也确实会涉及到类似问题。 海量数据,从时间上讲,难以快速处理。从空间上讲,难以一次加载到内存。针对海量数据,我们需要对时间和空间进行预估,而不是一根筋蛮力处理。 海量数据处理的常见思路如下: 1. 哈希分治,重新分类 2. hash ma...原创 2020-11-07 10:42:45 · 2517 阅读 · 2 评论 -
笔试面试题目:删除单链表的当前结点
之前,参加M公司的笔试,遇到这样一个问题: 有一个足够长的单链表,链表中间有一个结点的指针是p, 删除该结点。 这个问题有点奇怪,要删除p指向的结点,也就是把30的结点删除,然后把20和40连接起来。可问题是,不知道链表的头指针,也不知道指向20的结点指针,这就为难了。 可以从理论上证明,此题无解。 但是,理论上不可解的问题,实际上就真的不可解吗?未必!我来举个例子: 乞丐:求求你给我1...原创 2020-11-07 10:35:19 · 2036 阅读 · 7 评论 -
最大值最小值算法优化
周天,深圳,大雨。 今天来看一个简单的问题,即同时求最大值和最小值,具体问题和要求如下: 求数组的最大值和最小值,要求比较次数的数量级是O(1.5n). 我们先来看普通的直观解法:package mainimport "fmt"func getMinMax(a []int) (int, int){ if len(a) == 0 { // 异常处理 } min...原创 2020-11-07 10:32:13 · 4249 阅读 · 3 评论 -
笔试面试题目:求海量数据的中位数
中位数,也就是排序后位置在中间的数。中位数是笔试面试中的常客,在N年前T公司的实习生招聘和校园招聘中,两次遇到了这个问题。如果是求海量数据的中位数,那就不太好用上述方法了,因为没法把大文件中的海量数据加载到内存中。那该怎么办呢?原创 2020-10-04 19:44:58 · 4109 阅读 · 9 评论 -
笔试面试题目:两数之和 & 三数之和
两数之和(two sum)是很典型的笔试面试题目,也是leetcode的第一题。为了便于叙述,我把原问题简化一下:给定数组a[N], 判断是否存在两个元素的和为k. 阿里、腾讯、头条的面试官真的好喜欢leetcode. 祝拿到心仪的offer.原创 2020-10-04 19:43:44 · 3028 阅读 · 4 评论 -
笔试面试题目:1000的阶乘问题
大数阶乘问题,是很常见的,来看一下T公司的面试题目: 问题一: 1000的阶乘末尾有多少个0? 问题二: 1000的阶乘有多少位数? 问题三: 1000的阶乘的值是多少?原创 2020-10-04 19:28:18 · 5330 阅读 · 11 评论 -
top-K问题和随机选择算法
之前聊过top-K问题,有朋友反馈说,如果内存能容纳下这N个元素,那么使用堆处理top-K问题,并不是最佳算法。确实如此,在本文中,我们来循序渐进地看下top-K问题的处理思路:1.快速排序算法;2.直接选择算法;3.堆选择算法;4.随机选择算法。原创 2020-10-04 19:25:36 · 2680 阅读 · 1 评论 -
笔试面试题目:判断2^n, 3^n, 4^n, 5^n
F公司的笔试面试题目如下: 如何判断一个正整数是否为2的n次幂,3的n次幂,4的n次幂,5的n次幂?其中n为非负整数。要求:使用四种不同的算法。原创 2020-10-04 19:23:47 · 2718 阅读 · 3 评论 -
动态规划的本质
动态规划,是求解决策最优化的过程,在经济、军事、自动化等领域,都有广泛应用。动态规划的本质就是递推,然而,在有的动态规划问题中,递推并不明显,需要花心思去构建递推关系。原创 2020-09-20 23:43:16 · 3187 阅读 · 2 评论 -
手机号码之基数排序
七大常见排序是:冒泡排序、选择排序、插入排序、归并排序、希尔排序、快速排序和堆排序,它们都是基于比较的排序,时间复杂度最好能达到O(NlogN). 三大特殊排序是:计数排序、桶排序和基数排序,它们是非比较的排序,时间复杂度为线性。 在一些笔试面试题目中,排序算法几乎是必然会涉及到的,尤其是对于校招而言。原创 2020-09-05 12:26:49 · 3992 阅读 · 2 评论 -
华山论剑之桶排序
华山论剑开始,报名名单为:郭靖,黄蓉,洪七公,欧阳锋,欧阳克,周伯通,瑛姑,黄药师,杨康,穆念慈,柯镇恶,尹志平。 要获取所有参赛者的最终排名,该如何设计算法呢?如果用冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序,可能导致一些既浪费时间又浪费表情的比赛。可以考虑把参赛人分为四个水平段位,然后,在相同的水平段位中分别比较,这就是所谓的桶排序。原创 2020-09-05 12:23:45 · 2816 阅读 · 3 评论 -
高考分数排序之计数排序
在社会上摸爬滚打了几年,见识了一些人和事,越发意识到高考的重要性。很多高校和企业在招聘时,都非常看重学历(甚至是第一学历),这种筛选条件很世俗,但从概率的角度来看,合情合理。 高考成绩马上就要出来了,来聊聊与高考相关的算法问题。 问题:参加全国高考数学考试的人数为n, 数学满分为k(k=150), 求数学分数的排序结果。要求:时间复杂度为O(n).原创 2020-09-05 12:22:04 · 3092 阅读 · 4 评论 -
笔试面试题目:求“孤单数”(使用异或)
很久以前,参加X公司面试,遇到这样一道题目: 在数组中,只出现一次的数叫“孤单数”,某数组a中有两个“孤单数”,而其余数字出现次数都为偶数次,求这两个“孤单数”。要求:时间复杂度为O(n), 空间复杂度为O(1). 异或,是一种很巧妙的思维,这取决于异或独特的性质。在实际开发中,我们会偶尔用到异或,而且,这类按位运算是非常快的。在一些笔试面试中,异或也是常考的内容之一。原创 2020-08-01 08:54:27 · 3651 阅读 · 7 评论 -
笔试面试题目:求top-K(使用堆)
top-K问题是很常见的。在T公司的两次面试中,都遇到了这个问题,在S公司的面试中,也遇到了这个问题。本文来具体聊一下top-K问题:有N个整数,求出最大的K个值,内存无法容纳这N个整数。 一眼便知道是海量数据问题,直接用堆就行了,确实如此。但是,我觉得这样太经验主义了,为什么要用堆呢?为什么不用其它的数据结构呢?原创 2020-08-01 08:54:00 · 2787 阅读 · 1 评论 -
搜索引擎提示功能的实现(使用trie树)
大家经常使用google, 当输入搜索内容后,有自动提示的功能,节省了时间。那么,这个自动提示功能是怎样实现的呢?关于搜索匹配,我们讲到过哈希表,也简单提到过红黑树,但今天要说的trie树更适合这种场景,因为trie树能实现前缀匹配。 trie树,就是retrieval树,也就是检索的意思,名如其实,我们先来看看trie树的数据结构。与其它数据结构相比,trie树在前缀查找方面,有独特的优势,而且非常快。实际上,大家经常使用的IDE的自动提示功能,也能使用trie树来实现。原创 2020-08-01 08:53:31 · 3069 阅读 · 4 评论 -
判断元素是否存在于集合中(使用Bloom Filter)
今天,我们来聊Bloom Filter, 它是1970年由Bloom发明的,在判断元素是否存在于集合中时,有广泛的应用。引入Bloom Filter后,能标记字符串,而且大大节省了bitmap长度和空间,只是牺牲了一些准确性。在大数据的相关应用中,会经常看到Bloom Filter的身影。原创 2020-08-01 08:53:03 · 3459 阅读 · 4 评论 -
笔试面试题目:求url的交集(使用哈希分治)
A文件有50亿个URL,B文件有50亿个URL,每个URL平均长度为64,求A和B的交集,可用内存是1G. 哈希分治,思路巧妙。当我们遇到一个很大的困难时,要尝试分解大困难,然后各个击破,这样就瓦解了大困难,这就是哈希分治的思想。原创 2020-08-01 08:52:43 · 2514 阅读 · 3 评论 -
笔试面试题目:求整数的交集(使用bitmap)
T公司第三轮面试,问题如下: A文件有40亿个QQ号码,B文件有40万个QQ号码,所有QQ号码都是无符号整数,求A和B的交集,可用内存是600M. 从最开始的暴力算法,到哈希表,再到flag表,再到bitmap, 逐渐优化,终于解决了问题。在实际开发中,bitmap的应用也是非常广泛的。原创 2020-08-01 08:52:22 · 3009 阅读 · 2 评论 -
哈希表查找的本质
某一天,黄药师、欧阳锋、周伯通、郭靖、洪七公、一灯大师入住酒店,每人一个房间。 江南七怪柯镇恶,要去酒店找郭靖,怎么找呢?线性查找的思路是:逐个房间敲门询问,直到找到郭靖为止。对于初入门编程的人来说,这是最直接的思路,而且好像不容易找到其它思路。 然而,对于稍有点生活常识的人来说,线性查找的思路挺傻的,何不直接找出郭靖所在的房间号,然后直接去这个房间找郭靖呢?原创 2020-08-01 08:51:38 · 3140 阅读 · 3 评论 -
哈希表之简易数学原理和简易实现(史上最简单易懂的哈希表介绍)
什么是哈希表呢? 我先不说, 但其思想确实厉害。原创 2014-08-17 15:18:42 · 10763 阅读 · 13 评论 -
bitmap再出江湖:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G
之前聊过很多与bitmap有关的东东, 今天我们来看这样一个问题:a.txt中有40亿个无符号整数, b.txt中有10000个无符号整数, 求交集。 可用内存:1G. 很简单, 还是用bitmap, 思路我就不说了, 因为思路完全在下面的代码中:#include #include using namespace std;#define BIT_INT 32原创 2015-08-04 23:33:16 · 8842 阅读 · 8 评论 -
二叉排序树(BST)/二叉查找树的建立(BST是笔试面试的常客)
二叉排序树又叫二叉查找树,英文名称是:Binary Sort Tree. BST的定义就不详细说了,我用一句话概括:左 。 根据这个原理,我们可以推断:BST的中序遍历必定是严格递增的。 在建立一个BST之前,大家可以做一下这个题目(很简单的): 已知,某树的先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2原创 2013-06-09 19:49:03 · 88650 阅读 · 20 评论 -
二叉排序树(BST)的判定(其实不容易)
对于BST,一定要理解透彻,下面,我们给出一个有错误的BST判定程序:// 程序中的isBST函数的逻辑是有错误#include #define N 7using namespace std;// BST的结点typedef struct node{ int key; struct node *lChild, *rChild;}Node, *BST;// 在给定的原创 2013-06-09 22:08:08 · 13710 阅读 · 9 评论