forked from HuskyBin/Need-To-Do
-
Notifications
You must be signed in to change notification settings - Fork 3
/
ALL_Question
1835 lines (852 loc) · 63.4 KB
/
ALL_Question
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
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,group
generator
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]<a[x1+1]
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] 给定一个数组,删除最少的元素使得剩下的元素有序
等价于找最长上升(下降)子序列,见65题
82. [Facebook] BST中找中间节点
中序遍历一遍放到数组中,最后拿中间数
83. [Facebook] implement char *remove_badchars(char string[], char bad_chars[]) in place。
将bad_chars放到hash中查询,用两个指针来remove bad char, code略。。。
84. [Facebook] implement adding two unsigned numbers without using “+”
85. [Facebook] How to implement a smart_pointer
TO LEARN
86. [Facebook] implement sqrt
87. [Facebook] implement reader/writer lock
TO LEARN
88. given a word a and a word b, all are 6-letter. Also given a dictionary. Find a transformation from a to b, such that: (a) each time you can changeone letter; (b) all the changed word should appear in the dictionary
图的search问题,见crack the interview. 略…
89. 给定一个硬币集合{10,5,2,1},给定一个input amount,找出所有的硬币组合其sum可以等于这个数额,硬币可以被重复使用,就是说amount = 4, 集合可以是{2,2}.
90. 集合的intersection, union
TO LEARN
91. Given an int n, print all the numbers which are less than n and in the following pattern: 1,4,5,9,14… Write a recursive program.
看不懂…
92. How to sort a large collection of string?
因为string的比较开销比较大,所以可以考虑用radix sort. 见138题, America flag sort问题
93. How to serialize a very sparse tree?
保存parent->child关系
94. Given an arbitrarily long string, design an algorithm to find the longest repetitive substring. For example, the longest repetitive substring of “abcabcabc” is “abcabc”.
TO LEARN. Suffix tree的应用
95. reverse a link list within each k blocks
96. BST,排序双链表互相转换
CODE
97. 字符表格找单词,比如下面的3*3字符表格
1 2 3
4 5 6
7 8 9
每一个位置都是随机生成的char,给你一个字典然后找到表格里面所有可能的单词.
单词的定义是任意个连续字符组合,一个位置用过之后就不能再用.
回溯, 略。。。
98. 给一个string,输出所有由这个sting中字符组成的所有可能strings。然后,如果有重复的字符怎么办。如果给你一个string, 和输出string长度,找出由这个sting中字符组成的所有可能string
生成子集的问题,略
99. 给一个log 文件,找最长session。session定义:同一个userid,两log间隔时间小于一小时
不是很理解,用map<userid, list<time>> 来记录用户的登录时间,然后再扫描?
100. 不用乘法实现两数相乘 m*n, O(lgn)
101. 一个返回所有n比特格雷码的函数vector<int> getGrayCode(n) 比如 getGrayCode(2), 应该返回{0,1,3,2}
略。。。
102. 两个sorted array A,B, 问能否从A,B中各取且只取一个数,是他们的和为x
从两头scan, 略
103. 一个数组有N个元素,都大于0.将数组分成K段,求使最大的每段数组和的最小值
初始条件: f(x,y,1) = a[x] + … + a[y]
递推: f(1, n, k) = min(1<=i<=n+1-k)max{f(1,i,1),f(i+1,n,k-1)}
该问题的一个变体是: 有一个包括N个整数的数组,求k个数,使得这k个数排序后,相邻两个数的差的最小值最大。
先将数组排序
初始条件: f(x,y,2) = a[y] – a[x]
递推: f(1,n,k) = max(2<=i<=n+2-k)min(f(1,i,2), f(i,n,k-1))
104. 判断某个点是否在多边形的内部。按逆时针方向依次给出多边形的所有顶点。
图形学,考虑依次形成的所有夹角的和,如果在内为2pi, 否则为0
105. 判断一个set里是否有四个数的和等于一个target number.
预先计算所有两数之和,得到map<sum, vector<pair<index1,index2>>>
然后再这个map中搜索有没有和为target number的pair(并且index不能重复),时间和空间复杂度O(N^2).
另外一种做法是当成子集合问集,按target number(T)做DP,复杂度O(NT)
106. how to implement priority queue (describe) ?
用最大/最小堆来实现,堆的heapify操作
107. 找到数组中的第二大的元素
108. 两个人(A,B)参与一个游戏,规则如下:
1)一个随机的整数数列有偶数个数,a1,a2,…a2n
2)A先从数列取数,但只能从两头取,a1 or a2n
3)然后B取数,也是只能从剩下的两头取,依此类推,两个人轮流,都只能从两头取
4)最后谁手里的数和最大赢。
先拿的人有必胜策略,把所有的数按在奇数位和偶数位分成两组,则先拿的人可以选择拿到所有奇数位或者所有偶数位的数。
用DP求最后能拿到的最大的和:
设v[x,y]是当某人在数列剩下x到y位时,能拿到的最大值,n[x,y]表示需要拿的位置(x或者y)则
初始化: v[x,x] = a[x], n[x,x] = x
递推: v[x,y] = max(v[x] + (v[x+2,y]或者v[x+1,y-1], 由n[x-1,y]决定),
v[y] +(v[x,y-2]或者v[x+1,y-1],由n[x,y-1]决定))
n[x,y]由上一步取v[x]还是取v[y]决定。
109. 最大回文的详细解法
Suffix tree的应用, TO LEARN
110. 假定有个graph,怎么找出不带circle的最长path
有向无环图可以用DP解,一般情形下是NP完全问题
算法:
algorithm dag-longest-path is
input:
Directed acyclic graph G
output:
Length of the longest path
length_to = array with |V(G)| elements of type int with default value 0
for each vertex v in topOrder(G) do
for each edge (v, w) in E(G) do
if length_to[w] <= length_to[v] + weight(G,(v,w)) then
length_to[w] = length_to[v] + weight(G, (v,w))
return max(length_to[v] for v in V(G))
111. 关于外部排序
一般做法:
将输出数据分成K份,使得每一份都能放到内存中排序,然后将每一份排好序后写到文件
从每一份排好序的数据中读一部分到buffer,对buffer中的数据进行K-way merge后写到最终的文件。(这里存在一个多路归并的开销,和反复读取文件的开销的权衡)
如何改进性能:
a) 使用多块磁盘同时进行读/写
b) 使用多线程提高内存里的sort的性能
c) 使用异步的IO使sort和磁盘读/写同时进行
d) 多机的并行(map reduce ?)
e) 如果key较大,则可以使用radix sort提高速度
112. 正态随机
http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution
根据中心极限定义,一种简单的做法是,生成2N个(0,1)之间的随机数,然后将它们的和减去N,得到一个近似正态分布的数
113. 实现linkedIn里查找两个人之间connection的功能。(如果每人有100个熟人,假设任何两个人之间只隔6个人,需要space 100^6,内存放不下。所以改用同时从两边bfs, 需要space 2*100^3)
略。。。
114. 两个Sorted Array,找K smallest element, array1 长度M,array2长度N,要求O(logM+logN)
见68题
115. [Facebook] Given a string and a dictionary that maps a character to several
characters, print all combination and tell the complexity.
i.e., string = “face”, f=> f, @, 4, h a=> a, c, e
print: face, @ace, 4ace, …..
116. Merge sort linked list.
略。。。
详见http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
Merge sort linked list的特点:不需要额外空间,时间复杂度O(NlogN),并且是stable的
117. example:
char *words[] = {“foo”, “bar”, “baz”, NULL};
setup(words);
1) First step:
isMember(“foo”) -> true
isMember(“garply”) -> false
2) Second step:
isMember(“f.o”) -> true
isMember(“..”) -> false
*/
1. 用map即可。。。
2. 需要对words里面的每一个elements依次匹配。为了加速,可以预先对words构建一棵字典树。
118. Given an integer, print the next smallest and next largest number that has the same number of 1 bits in their binary representation.
xxx011100 -> xxx100011
从右往左扫,将第一个在1后面出现的0置1,xxx011100 -> xxx111100
将这个1后面的1置0, xxx111100 -> xxx101100
将剩下的1放到最右边,xxx101100 -> 100011
CODE略
119. 一个有n个整数数列,如果有符合下面条件,就返回1,如果没有返回0.
要求:a[i]+a[j]>a[k]; a[i]+a[k]>a[j]; a[j]+a[k]>a[i]
先排序,再比较相邻的三个数即可
120 很长很长的string/file, 要我找出中间重复次数最多的character, character set
可能是任何char set, unicode. (map reduce, multi-thread)
TO LEARN, 写一下用map reduce 怎么做
121. [Apple] You are given a deck containing n cards. While holding the deck:
1. Take the top card off the deck and set it on the table
2. Take the next card off the top and put it on the bottom of the deck in your hand.
3. Continue steps 1 and 2 until all cards are on the table. This is around.
4. Pick up the deck from the table and repeat steps 1-3 until the deck is in the original order.
Write a program to determine how many rounds it will take to put a deck backinto the original order. This will involve creating a data structure to represent the order of the cards. This program should be written in Python. It should take a number of cards
in the deck as a command line argument and write the result to stdout.
略。。。
122. Suppose there is a binary tree having millions of nodes and by mistake one node has two indegree (i.e. There becomes a cycle/loop in that tree. Tou have to find that node which is having two indegree) Constraint is no extra memory can be used and tree representation is in Linked list format.
???可能吗?没有额外memory, 否则做个DFS/BFS即可
123. Print the nodes on the exterior of a binary tree in a anti-clockwise order, i.e., nodes on left edge, then leaf nodes, then nodes on right edge.
先按层遍历,将每一层的开始放到left edge, 结尾放到right edge. 再中序遍历打出所有的leaf node(这里取决于leaf node的定义), CODE取自:
http://www.leetcode.com/2010/10/print-edge-nodes-boundary-of-binary.html
124. 已知整数 m ,其二进制形式有 k 位为1,打印出 0≤x≤m 所有满足以下条件的 x
x^(m-x) = m,其中^是异或运算符。在 0≤m<2^n 范围内对每一个 m ,打印出所有的 x ,并求总复杂度。
TO LEARN, 像数学题
125. You can win three kinds of basketball points, 1 point, 2 points, and 3 points. Given a total score X, print out all the combination to compose X. (recursion/ Dp)
略。。。
126. 有n个job,分配给3个打印机,求所有任务完成的最短时间。例如:3,5,4每个打印机占1个job,最短时间是5. 15,7,8,10, 4, 15给1号打印机,7,8给2号打印机,10,4给3号打印机,最短时间是15.
http://en.wikipedia.org/wiki/Partition_problem
见133题
127. 设计一个算法,判断一个integer n是不是可以表示成k(k>=2)个连续正整数的和
假设所要分解的数为x ,分解成n个数,那么我们可以这样表示:
x=m+(m+1)+(m+2)+……….+(m+n-1)
其中m为分解成的连续整数中最小的那一个,并且我们知道m大于等于1的正整数。易知:
x=(2m+n-1)*n/2, 变换一下的m=(2*x/n-n+1)/2
由m的范围我们知道(2*x/n-n+1)/2>=1 以上就是x和n的关系。给定一个n看是否x能分解成n个连续整数的和可以判断是否存在m,也就是转换成(2*x/n-n+1)是否是偶数。
代码略
128. how to serialize and deserialize a n ary tree?
见79题
129. 如何刷屏最快
G(n) = max{G(n-1)+1, g(n-k)*(k-2)}
130. Given a sorted array with duplicates and a number, find the range in the form of (startIndex, endIndex) of that number. For example, given 0 2 3 3 3 10 10 and 3, return (2,4). Given the same array and 6, return (-1,-1).
Binary Search的扩展,见142题
131. 有N个整数,M个bucket,每个bucket都可以装至少N个整数,一个bucket的value等于放入它的所有整数的和。现求解一种分配方法,使之 minimize(the max value of all buckets)
NP完全问题,见:
http://en.wikipedia.org/wiki/Job_shop_scheduling
132. Given pairs of connected items ((A, B), (B, C), (C, D)…), find the root
node of this tree.
找到入度为零的node即可
133. There’s a book and each sentence consists of several words. How to find the minimal set of words which can used by the reader to understand half of total number of the sentences. Each sentence is readable if the reader knows all the words.
TO LEARN, 有点类似于dancing links用到的满足问题
134. [facebook]求一段时间内出现最多的ip address(es)
只能是搞几张aggregate表,按秒,分钟,小时等做为粒度。。。
135. 两个文件里面存着行程安排,开始时间以及结束时间,设计算法找所有conflicts。
如果要找所有conflicts, 则复杂度为O(N^2), 略。。。
136. what’s the best data structure for storing and looking up a huge amount of url’s (presented in a prefix format) like these:
com.google.www -> value1
com.yahoo.finance -> value2
com.yahoo.finance/stocks -> value3
com.yahoo/finance -> value2
1.2.3.4/node/123 -> value4
….
the requirements are:
1. it has to be compact (compression if necessary).
2. lookup time should be fast (constant would be ideal, but a few level of tree lookup is fine too).
有点类似于设计题,可以用一个优化过的prefix tree?
137. Subset sum problem
可以转换为背包问题
138. Dutch National Flag Problem (DNFP)
http://www.iis.sinica.edu.tw/~scm/ncs/2010/10/dutch-national-fl
如果有多于三种元素,则称为America Flag Problem, 本质上是radix sort
139. 一个单词的列表,要找出两个单词,它们没有相同的字母出现,而且长度乘积最大
难题, TO LEARN
140. You are given N blocks of height 1…N. In how many ways can you arrange these blocks in a row such that when viewed from left you see only L blocks (rest are hidden by taller blocks) and when seen from right you see only R blocks? Example given N=3, L=2, R=1 there is only one arrangement {2, 1, 3} while for N=3, L=2, R=2 there are two ways {1, 3, 2} and {2, 3, 1}.
DP题,定义g(n,l,r)为题目的答案,而f(n,l)为n个block,从左边看到l个block,则递推公式为:
g(n,l,r) = (1<=k<=n)sum(C(n-1,k-1)*f(k-1,l-1)*f(n-k,r-1))
f(n,l) = (1<=k<=n)sum(C(n-1,k-1)*f(K-1,l-1)*(n-k)!)
f(n,1) = (n-1)!
F(n,n) = 1
F(n,m) = 0 if n < m
141. There is a binary tree(Not a BST) in which you are given three nodes x,y,z. Write a function which finds whether y lies in the path b/w x
如何定义in the path?…略。。。
142. binary search的各种变种
1)如果找不到元素,返回应该插入的位置
2)如果数组允许有重复,寻找最小的那个i,使得arr[i] = v, (第一次出现的位置)
3)如果数组允许有重复,寻找最大的那个i,使得arr[i] = v
与2)类似
4)如果数组允许有重复,寻找最小的那个i,使得arr[i] > v
5)如果数组允许有重复,寻找最大的那个i,使得arr[i] < v
与4)类似
6)给2个有序数组,大小一致,如何求他们的median
见第68题
7)循环数组的二分查找
143. 怎样de-dup一个sorted array?
可以直接线性扫描,也可以用binary search来优化(如果重复数比较多)
follow-up: 如果有一个big single file, many servers, how to use these servers to compute this problem? 要求尽量balance load
balance load,可以将big file分成比较小的块,每台机器完成若干块,根据计算情况进行调度。
144. Given a number n, find the nearest palindrome of n just greater than n.
算法:
看左边一半的反是不是等于右边一半,如是,直接返回
如果不是,看左边一半的反是不是大于右边一半,如果是,将右边一半改成左边一半的反,再返回
否则,将左边一半的最后一位加1,再重复第二步(这次不用考虑大小)
CODE
145. 有一个不定长的char string (S1),都是0,1组成;另外一个string (S2), 也是0,1
组成,可以认为是pattern,问S1中是否含有S2
e.g S1 = 11100011 10101011 11111111 10000100 ( 4 bytes, ’11100011′ is 1 byte)
S2 = 00111010
the answer is ture, 1110″00111010″1011
http://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_string_search_a
Rabin Karp算法 ? 略。。。
146. Write a function for a linked list that exchanges the positions of the nodes after the nodes referenced by two given pointers t and u. (assume t and u are either in the list or NULL).
Example:
1 2 4 3 6 8 5 7 9 10
Exchange nodes after 2 and 3:
1 2 6 3 4 8 5 7 9 10
简单题,略。。。
147. Design a data structure for a text editor. Require better than linear for both line search and insert a new line.
Notepad++使用gap buffer, 即在一段buffer的中间留下空间,这样插入和删除操作都是O(1). 关于search,可以用Rabin karp算法。
Rope 也是一种可以考虑的数据结构,见:
http://en.wikipedia.org/wiki/Rope_%28computer_science%29
148. Given an array of 0′s and 1′s. only, find the maximum length of the subarray such that the number of 0′s and 1′s in that subarray are equal.