奇数位递增偶数位递减的数组_百亿题典之C++编程题面试题

1. 在linkedlist中找倒数第N个结点2. 倒转linkedlist3.二叉树的结点有指向parent的指针,求最近公共祖先4.给一个数组,如何打印该数组成员构成集合的全部子集合.5.有两个字符串,一个是text,一个是command, Command有四种:‘+’: 在text中前进一位‘-’: 在text中后退一位‘a’: 在当前位置插入一个字符,字符由command中的后一位决定‘d...
摘要由CSDN通过智能技术生成

1. 在linked

list中找倒数第N个结点

2. 倒转linked

list

3.

二叉树的结点有指向parent的指针,求最近公共祖先

4.

给一个数组,如何打印该数组成员构成集合的全部子集合.

5.

有两个字符串,一个是text,一个是command, Command有四种:

‘+’: 在text中前进一位

‘-’: 在text中后退一位

‘a’: 在当前位置插入一个字符,字符由command中的后一位决定

‘d’: 删除当前字符

实现函数Process(string& text, string& command,

string& result);

Coding题,大致要点:

扫描一遍command,看看有多少加字符的command,再建一个满足大小要求的临时数组,copy text

在临时数组上进行操作,注意插入和删除的复杂度都是O(N)

6.

实现一个LRU的cache

数据结构:

插入新cache的算法:

如果找到了,用splice函数将刚刚被访问的CacheEntry移到队首。

关于多线程,一般来说reader/writer lock不适用,因为reader也会更改LRU

cache. 一种解决的办法是让每个线程拥有自己的cache.

7.

两个排序的数组,求它们的交集

8.

在二叉树中添加额外的两个指针(树可能非满),遍历整棵树并将同一层的结点用这两个额外指针连接起来

9.

用一个给定的值partition一个数组,注意这个值不一定在数组中出现

10. 用数组实现一个queue,

考虑以下一些内容:

a)

实现固定size

b) 实现可变size

每次size不够用时,建一个更大的array并复制原有数据

c) 与linked

list的实现相比,有什么好处和坏处?保证了操作恒定为O(1),但是内存有浪费,且不连续

d)

如何处理thread safe

在queue被更改的情况下,使用locker

Lock-free code,

11. 洗牌算法

For i = 0 to n-1,

生成一个i到n-1之间的随机数j,将v[i]与v[j]交换

12. [Microsoft]

对stack上的元素排序,可以使用的方法有pop(), top(), push(), isEmpty(),

isFull().

13. [Microsoft]

有一个M*N行的矩阵,如果第(i,

j)个元素是0,则把i行和j列都设为零,注意尽量少使用额外空间

分成如下几步:

扫描第M行和第N列,看(M,N)是否需要设为零

扫描每行和每列,在第M行和第N列记录对应的列和行的结果

扫描第M行和第N列,将其所对应的列和行记为零

处理(M,N)

14. [Microsoft]

一个二维空间第一象限有很多点,怎么找出最外围的那些点?

Graham扫描算法:

选出y最小的起始点p0

将其它所有点按相对于p0的极角排序,记为p1,p2,…pN-1

将p0, p1, p2 push到栈

对余下的所有点:

a) Px为栈顶的下一个点,Py为栈顶,当前点为Pi

b) 如果Py->Pi,

相对于Px->Py向右

i. Pop栈

ii. Push Pi到栈

算法复杂为O(NlogN) (第二步的排序)

15. [Google]

返回一组字符串的最长公共前缀,如 “abc”, “abcdef”, “abcd”,

则返回”abc”

16. [Microsft]

给出平面上第一象限内landscape的轮廓,也就是一些列的(x,y)坐标, x=0,1,…,N

,以及Y轴上光源坐标(0,H)。问这N+1个点钟那些被照亮那些是阴影。(叉乘)

一一计算光源到(x,y)的角度,再与左边的角度对比即可知是否被遮挡,复杂度O(N)

17. [Microsoft] 一个linked

list,每个节点除了正常next指针外,还有一个extra指针,这个指针可以指向链表中的任一节点,不同的extra指针可以指向同一个节点,extra指针也可能

形成loop。问怎么复制这个结构。

18. [Microsoft]

怎么组织字典,使得在解cross puzzle时可以很快得到满足条件的所有单词(比如

所有第二个字母是o,第5个是H的单词)。不过这题算brain storm,不用写code.

按单词的长度不同,构造多个container

对某一组长度相同的单词,构造多个index, 从(2,o), (5, H) 映射到单词(id),

每一个collection保持有序,可以加快merge的速度

19. [Google] 如何设计binary

tree和hash table的iterator

Binary Tree Iterator:

假设是中序遍历的话,在iterator中保存一个遍历的状态(parent node

stack).

Hash Table Iterator:

取决于hash table的数据结构,一般直接按array或者bucket顺序遍历就可以了。

20. [Google]

设计一个class,类似于stack, 但可以是O(1)时间内返回min()

给stack加一个只用来保存当前最小值的stack,

Push时,如果当前值比minStack栈顶小,则也push到MinStack,

Pop时,如果minStack栈顶与当前pop元素一样大,则也pop minStack

21. [Google] 比较两个binary

tree是不是完全一致

递归比较 if (tree1->value == tree2->value)

&& is_equal(tree1->left, tree2->left) &&

is_equal(tree1->right, tree2->right)

22. [Google]

一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数

考虑二个数a,b, a与b先比,大的与当前最大比,小的与当前最小比。两个数共需要比较三次。

23. [Google]

在一个循环有序的数组里查找一个数

24.

[Google] 给一个array和一个target value,

检查array里是否存在两个数之和为target

两种做法:

先对数组排序,然后从两头开始scan

建一个hash table, 然后scan 数组,去查找,注意要处理正好有一个数等于target的一半的情况

25. [Google] 给一个文本,

然后给出几个关键词及他们所出现的位置,比如

this: 1, 16, 55….

is: 5, 33, 77…

要求找出最短的一段文章使其具备给出的关键词。

大致算法:按位置往后找,直到所有的词都出现,然后再尝试把左边的位置缩减。如此直到找到更短的区间。

见后面的find_min_window的程序,这里需要处理inverted index

26. [Google] 给出一棵tree,

该tree没有任何特征, 即可以有多个子节点, 父节点和左右子节点也

没有大小关系。但每个节点的值不相等。现给出几个值, 如(12, 24) 请找出从根节点到值为12

和24的节点的subtree.

27. [Google] 给一个array,

再给一个sh值, 设计函数将数组内的所有元素向右偏移sh个位置(将数

组看成一个圈)。

见Programming Pearls, 先把[a,c] reverse,

再reverse[a,b],[b,c]

28. [Microsoft]

删除数组中的重复元素

略。。。

29. [Microsoft]

按如下规则转化数字的字符串

(integers that appear >=1 times)

(integers that appear >=2 times)

(integers that appear >=n times)

并保持字符原来的顺序

例如: 12223314->12342312

略。。。

30. [Microsoft]

检查一个表达式中的括号是否合法,括号包括 {, [, (, ), ], }

简单的栈的应用

31. [Microsoft]

如何高效地用堆栈模拟队列.

使用两个stack, s1和s2

Push时,push到s1

Pop时,若s2非空,则从s2中pop, 若s2为空,则将s1的全部元素pop到s2中,再从s2中pop

分摊复杂度为O(1)

32. [Microsoft] 打印中两个整数范围内的所有素数,例如:(12,

15) ->13

1. 单个验证是否为素数

2. 筛法

33. [Google] 求直方图的最大内接矩形

TODO

34. [Google]

NxN行列有序的矩阵查找一个数

两种方法,1从角上开始search, 2, Divide and Conquer

分治法可以用来解决另外一个问题,在行列有序的二维数组中,大于/小于0的元素有多少个?

35. [Google]

将MxN的矩阵转秩,要求O(1)的空间复杂度.参考群论中cyclic

group,groupgenerator

TO LEARN

36. Inplace perfect shuffle

TO LEARN

37.

有一个矩阵A,找出这个矩阵中所有的A(i,j),它所在的行和列都是0.

依次扫描?略。。。

38. 有一个变长的characters system,

每个character所占的bytes数不固定。每个character的最后一个byte的值是0.

一个字符串由这些变长的characters组成。字符串

的最后两个bytes是0. 要求反转这个字符串。额外空间使用越少越好。

先将整个字符串反转,再按个字符反转

39.

有n张扑克牌,从中随机选出几张。要求找出所有的选法,使得所选扑克牌的点数的和是s. 不用recursion,代码行数越少越好。

TODO 如何不用recursion?

40. [Google] 有1G内存和4

billion个整数,输出一个不在这些整数内的数, 如果只有10MB内存呢?

1. 1G内存有1024*1024*1024*8个位,扫描一遍记位即可

2. 如果内存不够,可以依次处理10*1024*1024*8个数,需要扫描4*1024/10/8大概50趟

41. [Google] Merge N个sorted

array

42. [Google]

给一个大小为N的数组,输出所有大小为K的子集(K<=N)

TODO

43. [Microsoft] 已知 bst 和两个数,

求在此范围内的节点数。递归和非递归

中序遍历,加一个collection作为参数即可

44. [Microsoft] 已知 bst 和一个数, 找到next

larger number, O(logn)时间

TO CODE

45.

N*N的正方形内有黑白两色,求四边都是黑色的最大的子正方形

TO LEARN

46. 平面上有一组点集,求穿过点最多的直线

计算两两点够成的直线方程x+By+C=0, 找出出现次数最多的方程即可

47. 实现itoa

48. 给一个2D 的 matrix,按 spiral

order打印

49. [Google] 一个字符串,复制所有的’x’, 再删除所有的’z’,

其它不变

略。。。

50. [Google] 实现memcpy(void *src, int

size, void

*dest);判断参数合法性,判断src,dest是否相等, 是否

overlapping 时会出错,

注意memcpy和memmove的区别

51. [Google]

大小为N的数组,给出一个大小为K的随机子集

作一个shuffle,然后选取前K个(因此shuffle时只要进行到第K个即可)

52.

[Microsoft]判断这四个点是不是构成了一个矩形

TODO

53. 实现 char* strtok(char* str, const

char* delimeter)

略。。。应该需要用到static变量

54.

美国的coin设计为1,5,10,25,任意给定一个change,用greedy

algorithm可以算出最少所需要的coins,如何判断一组coin是否可以用greedy

algorithm?

TO LEARN

找硬币的DP程序:

55. 给定5张牌,写一个函数判断是否有两对

略。。。

56. 在BST中删除一个节点

57. [Microsoft]

给你一个地址/a/b/../c/./d.txt, 让你把它normalize。

58. [Microsoft]

给出一个BST和一个值,求所有和等于这个值的Path.

59. [Microsoft] 按层打印树

60. [Google]

五个非常大的数组求交集(考虑时间,空间,I/O)

61. [Google]

两个排序好的数组,求和最小的M个pair, 比如 A={1, 2, 4, 5, 6}, B={3, 5, 7,

9}

m=3那么Results就是(1, 3),(2, 3),(1, 5)

这个结构形成了一个行列有序的矩阵,这个题就类似于在行列有序的矩阵中找第k个元素。

结论是:

对于一个n×m(n≤m)的矩阵,若每行和每列都是递增的,则可以在O(nlog2m/n)找到第k大的数。论文题目为“Generalized Selection and Ranking: Sorted

Matrices”

如果是查中位数:

先找出每一行(列)的中位数,再找出中位数的中位数,这样可以去掉接近一半的数,再在剩下的数里找中位数即可,复杂度O(N(logN)^2)

62. [Microsoft]

一个数组,有大小写字母和数字,一次编历,大写字母在一起, 小写字母在一起,数字在一起.

见138. Dutch National Flag Problem (DNFP)

63. [Google] 1.

给定一个树和任意2个nodes,找出来最小的subtree包含这2个nodes

第26题2. 写BFS算法打印subtree的nodes 等价于分层访问树

3. 如果把树变成了graph(可能有loop),怎么改刚写的BFS 需要标记已经访问过的点

64.

实现next_permutation

算法:

1.

从后往前找,找到第一个x1,使a[x1]

2.

从后往前找,找到第一个x2,使a[x2]>a[x1]

3. 交换a[x1],a[x2],

并且反置a[x1+1 … end]

65. 最长上升子序列

66. 给一个single linked list,

里面有true和false两类的node,写一个程序把

true node 和false node分类,并且中间生成一个新的node把两类分开。

将true和false两类node接到两个不同的list,最后再合并即可

67. 1 billion

query里选出时间最近5分钟内最frequent的1000个query,one

pass

精确解:选出所有5分钟内的query,count每个query的个数,同时维护一个最大堆,最后得到查询

扩展:如果query的数量非常大,则可以在一个个time windows里面做一些sample,

最后把这五分钟内的sample结果合并起来

68.

两个排序数组找共同中值。

69. 实现strstr(str1, str2)

70. 给定一个排好序的linked

list,删除其中所有的重复元素。比如给定1->2->3->3->

4->4->5,返回1->2->5。给定1->1->1->2->3,返回2->3

71.

返回给定字符串的第一个不符合字母顺序的index,

比如abcdaf就需要返回第二个a的index,比如aZe就返回e的index

依次扫描即可。。。

72.

检查sudoku的输入是valid,允许solution是不完全的

73. 实现 wildcast string

matching.

74.

给你一本dictionary,任意给你七个letters,让你找出包含这七个字母的、最长的单词。条件:可以pre-processing,这样每次给你不同的letters时,可以very

efficient

将单词按长度从长到短编号

对每一个字母,建一个collection,按编号排序。

对给出的七个字母,找到它们的collection中的第一个共同的字母。

75. 表达式求值

76. 两个string, 给出它们的两个substring,

定义它们的距离为distance=\sum_i|s1[i]-s2[i]|,

怎么找距离最大的两个substring?

穷举。。。 有没有更好的办法?

77

N*N的0/1矩阵,找出最大的全0矩阵

最大直方图的应用, O(N^3)时间复杂度

78. 将一个linked

list按不同元素的值分组

用多个head放不同元素的组,最后合并

79. serialize and re-construct binary

tree.

按pre-order遍历,写入结点,包括NULL的子结点

Re-construct的时候,读入结点,构建node,再递归构建child,(当该Node不为空)

80. 手机上的电话号码提示, 用prefix

tree

CODE

prefix tree

81. [Facebook]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值