Skip to content

Latest commit

 

History

History
324 lines (159 loc) · 11.6 KB

数据结构与算法.md

File metadata and controls

324 lines (159 loc) · 11.6 KB

数据结构与算法(🔥)

对于算法面试准备,无疑就是刷《剑指Offer》+ LeetCode 效果最佳。刷《剑指Offer》是为了建立全面的算法面试思维,打下坚实的基础,刷LeetCode则是为了不断强化与开阔我们自己的算法思想。这两块 CS-Notes 中已经实现地很完美了,建议大家将《剑指Offer》刷完,然后再至少刷100道LeetCode题目以上

建议刷完《剑指Offer》+ 至少100道LeetCode题目后,再去进一步看看下面的高频题目有哪些没有刷到。

一、高频题集 (⭐⭐⭐)

1、无重复字符的最长子串

2、简化路径

3、复原IP地址

4、三数之和

5、岛屿的最大面积

6、搜索旋转排序数组

7、朋友圈

8、接雨水

9、反转链表

10、两数相加

11、合并两个有序链表

12、合并K个排序链表

13、买卖股票的最佳时机

14、买卖股票的最佳时机 II

15、最大子序和

16、最小栈

17、LRU缓存机制

18、寻找两个有序数组的中位数

19、最长回文子串

20、合并两个有序数组

21、整数反转

22、排序链表

23、子集

24、全排列

25、实现二叉树中序遍历(不使用递归)

26、爬楼梯(斐波那契数列)

27、滑动窗口的最大值

28、判断单链表成环与否?

29、如何从一百万个数里面找到最小的一百个数,考虑算法的时间复杂度和空间复杂度

30、手写数组实现队列

31、java排序算法和查找算法 (写出你所知道的排序算法及时空复杂度,稳定性)

http://www.jianshu.com/p/8c915179fd02

http://xiaojun-it.iteye.com/blog/2291852

二、次高频题集 (⭐⭐)

1、算法熟悉么?给了一个二叉排序树,出了一个给定节点找到它的下一个元素(指的是大小顺序的下一个)的算法题。

2、x 个苹果,一天只能吃一个、两个、或者三个,问多少天可以吃完

4、如何设计一个抽奖系统,比如满200抽20,满500抽50。

5、求无序数组中的中位数

6、二叉树深度算法

7、堆和栈在内存中的区别是什么(数据结构方面以及实际实现方面)

8、最快的排序算法是哪个?给阿里2万多名员工按年龄排序应该选择哪个算法?

9、堆和树的区别?

10、求1000以内的水仙花数以及40亿以内的水仙花数;

11、子串包含问题(KMP 算法)写代码实现;

12、万亿级别的两个URL文件A和B,如何求出A和B的差集C,(Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)

13、蚁群算法与蒙特卡洛算法;

14、百度POI中如何试下查找最近的商家功能(坐标镜像+R树)。

15、5枚硬币,2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬币和反面向上的硬币个数相同;

16、时针走一圈,时针分针重合几次;

17、N * N的方格纸,里面有多少个正方形;

18、请在100个电话号码找出135的电话号码 注意 不能用正则,(类似怎么最好的遍历LogGat日志)

19、一个青蛙跳台阶,一次可以跳一步和两步,如果一共有N个台阶,可以有几种跳法?

20、写代码实现队列的基本操作,外加查找最大值;

21、图:有向无环图的解释

22、二叉树 深度遍历与广度遍历

23、B树、B+树

24、密码学中两大加密算法是什么

25、判断环(猜测应该是链表环)

26、有一个 List 列表,去掉列表中的某一 Object 对象,如何在 for 循环里面写;

27、设计移动端的联系人存储与查询的功能,要求快速搜索联系人,可以用到哪些数据结构?(二叉排序树,建立索引)

28、一道简单不易的算法题

    int  a = 10;  
    int b=5;
    怎么在不引入其他变量的情况下,让a和b互换?

```
public class Test {
   int  a = 10;  
   int b=5;
public static void main(String[] args) {
   a = a+b;
   b=a-b;
   a =a-b; 
   System.out.println("b="+b);
   System.out.println("a="+a);
 }
}
----输出:
b=10
a=5      
```

29、回形打印二维数组

30、二叉树,给出根节点和目标节点,找出从根节点到目标节点的路径

31、一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法

32、两个不重复的数组集合中,求共同的元素。

33、上一问扩展,海量数据,内存中放不下,怎么求出。

34、从长度为m的int数组中随机取出n个元素,每次取的元素都是之前未取过的,如何优化

35、逆序一个字符串,不能调用String的reverse方法(考察编码风格)

36、算法:将一个有序数组去重得到一个新数组(空间复杂度为O(N))

37、算法:如何从1T的无序数组(长度为n)里面找出前k大的数据,复杂度要求为O(logN)

38、m * n的矩阵,能形成几个正方形(2 * 2能形成1个正方形,2 * 3 2个,3 * 3 6个)

计数的关键是要观察到任意一个倾斜的正方形必然唯一内接于一个非倾斜的正方形,而一个非倾斜的边长为k的非倾斜正方形,一条边上有k-1个内点,每个内点恰好确定一个内接于其中的倾斜正方形,加上非倾斜正方形本身,可知,将边长为k的非倾斜正方形数目乘以k,再按k求和即可得到所有正方形的数目。


设2≤n≤m,k≤n-1,则边长为k的非倾斜有

(n-k)(m-k)个,故所有正方形有

∑(m-k)(n-k)k个

例如m=n=4

正方形有331+222+113=20个。

39、面试头条的时候在线编程:从上到下从左到右输出二叉树

40、从长度为m的int数组中随机取出n个元素,每次取的元素都是之前未取过的,如何优化

41、逆序一个字符串,不能调用String的reverse方法(考察编码风格)

42、算法:将一个有序数组去重得到一个新数组(空间复杂度为O(N))

43、算法:如何从1T的无序数组(长度为n)里面找出前k大的数据,复杂度要求为O(logN)

44、堆和树的区别

45、堆和栈在内存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?

46、什么是深拷贝和浅拷贝

47、手写链表逆序代码

48、讲一下对图的理解

49、手写一段代码,如何找出一段字符串中,出现最多的汉字是哪个?

50、单向链表逆序。

51、实现一个数组插入。(处理异常判别,不使用Collections相关接口)。

52、找到无序数组的最大连续求和。

53、找到多个员工的共同繁忙时段。

https://github.com/banking/algorithm-dish/blob/master/algorithm-question/src/main/java/TimeAirbnb.java

54、输出一个集合{A,B,C,D}的全部子集**

55、手写代码:遍历文件目录;

56、电梯运行的算法分析;

57、手写实现单链表的get操作;

58、100个数字排序怎么做?

59、一个集合里有1000万个随机元素,如何快速计算他们的和(我特喵的以为是考算法,想半天没有O(n)以下的方案,结果他居然说多线程)

60、切饼问题:1刀切2块,2刀切4块,10刀最多切几块。

61、追击问题:2辆火车相向同时出发,一个从A点出发,速度是30km/h,一个从B点出发,速度是20km/h,A、B之间的距离是S,同时一只鸟也从A点出发,速度是50km/h,鸟在两辆火车间折返飞行,问三者相遇时,鸟飞的总路程。

62、算法:给定一段已排好序的数列,数列中元素有可能是重复的,找出数列中目标值的最小索引,要求不能用递归,只能用循环。

63、一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法

64、2000万个整数,找出第五十大的数字?

65、烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?

66、求1000以内的水仙花数以及40亿以内的水仙花数

67、称重问题:10个箱子,每个箱子里都有若干砖头,其中有一个箱子里每个砖头重9克,其他的箱子里的砖头每个重10克,给你一个秤,要求只能用一次称重找出砖头重9克的箱子。

68、时针走一圈,时针分针重合几次

69、N*N的方格纸,里面有多少个正方形

70、标号1-n的n个人首尾相接,1到3报数,报到3的退出,求最后一个人的标号

71、给定一个字符串,求第一个不重复的字符 abbcad -> c

72、上网站写代码,如下: 有一个容器类 ArrayList,保存整数类型的元素,现在要求编写一个帮助类,类内提供一个帮助函数,帮助函数的功能是删除 容器中<10的元素。

73、写代码,LeetCode上股票利益最大化问题

74、写代码,剑指offer上第一次只出现一次的字符

75、算法:连续子数组的最大和

76、子串包含问题(KMP 算法)写代码实现

77、ViewGroup的层级深度,转换为二叉树的层级深度

78、String字符串的数字相加

79、使用三个线程顺序打印有序的数组

80、给定一个有序的数组和目标数,找出与目标数最近接的index,要求复杂度是log(n)的时间复杂度

81、给定一个二叉树和一个目标数,在二叉树中是否存在一条路径的所有节点的和与目标数是相同的case,并且打印。

82、二叉树,读取每一层最右边的节点

83、int数组,除了一个数字外,其他数字都出现两次,找出这个只出现一次的数字

84、一个类,内部有一个链表的数据结构,实现void add(Node n)和void remove(int index)的函数

85、手写消费者生产者模型的代码

86、一个无序的int数组,给一个target数字,找出数组中两个数字相加为target,并输出坐标

87、数组中存有1-3的三种数字,例如[1,2,3,1,2,2,1,3,3],将其排序为[1,1,1,2,2,2,3,3,3],要求时间复杂度,后续将内容变为一个对象,继续排序

88、"之"字形打印二叉树

89、1~100盏灯,都是亮的,第一次将能被1整除的数的灯按下,变暗,第二次将能被2整除的数的等按下,变亮,第三次将能被3整除的数的等按下,变暗…第100次将能被100整除的数的灯按下,问,最后有多少盏灯是亮的。

90、实现一个o(n)复杂度的堆和最大数。

91、实现一个数组的窗口扫描算法。

92、识别一个字符串是否是ipv4地址。

93、o(n)复杂度实现偶数递增奇数递减单向链接排序。