4. 给一个integer的array,按照n1<=n2>=n3<=n4>=n5 的order排序(sort, 每3个把最大的放中间,然后跳两个继续扫描)
public static void sort(int[] num){
if(num==null || num.length<2) return;
for(int i=1; i5. class Foo() {
int a;
String b;
}
实现这个类的equals方法,cornor case比较多 后续问了很多基础知识,private, protected, public default的区别,final是干什么的,==和equals的区别,然后要求精简代码,最后缩短到四行,然后问了实现了equals还要干嘛,还要实现hashcode,然后楼主就a + b.hashCode给实现了一下,注意b=null的情况。基本就这么多了
(1) private, protected, public default的区别
Modifier | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public | y | y | y | y
————————————+———————+—————————+——————————+———————
protected | y | y | y | n
————————————+———————+—————————+——————————+———————
no modifier | y | y | n | n **also known as package-private**
————————————+———————+—————————+——————————+———————
private | y | n | n | n
(2) == compares 2 reference for non-primitives, == compares values for primitives, equals compare state(attributes) for non-primitives, but the method may be overridden.
(3) write an equals() function: the equals function of String:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n– != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
(4) compare using hashcode
1.如果两个对象相同,那么它们的hashCode值一定要相同;
2.如果两个对象的hashCode相同,它们并不一定相同(这里说的对象相同指的是用eqauls方法比较)。
如不按要求去做了,会发现相同的对象可以出现在Set集合中,同时,增加新元素的效率会大大下降。 3.equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
6. 两个数组分别代表两个整数,相加。lc原题。回答最优情况下的复杂度。
7. 迷宫寻宝。一个grid表示的地图,上面有宝物,有障碍,要求找出图上一个点到所有宝物的总距离最短。我用了bfs.
8. 在某个游戏中设计一个排名更新算法。排名是根据各玩家的分数决定的,从高到低。设计数据结构。实现两个函数:第一个:输入是玩家名,输出是玩家排名;第二个:输入是玩家名和玩家的新分数,要求更新排名。
我的想法:用arraylist 和hashtable,arraylist里每个node有玩家key,分数,排名,排名是arraylist的index,然后用binary search更新玩家排名,use lazy approach, update rank in a node only when needed。
9. 把一个整数组里所有零移到后面。
10.problem solving:
2 player game
- there’s a set of marbles
- take turns removing 1 or 2
- winner removes the last one
- you get decide who goes first
我大概解释下,就是有俩人玩儿个游戏,现在桌上有n个弹球,你和你的对手轮流取,一次一个人只能取1个或2个,把桌面清空的那个人胜利。
你来决定谁第一个取弹球,在不同弹球数量n的情况下,请问你是否能制定出一个必胜策略?
(1)solution1: 先枚举一些case归纳(OP= opponent):
n=1,2 I first (很显然我可以一次拿完直接胜利)
n=3 OP first (让对手先拿,他拿一个我就拿俩,他拿俩我就拿一个,最后一定是我赢)
n=4 =1+3 I first (我先拿一个,然后轮到对手,立马转化为n=3的情况,最后一定是我赢)
n=5 =2+3 I first (我先拿两个,然后轮到对手,立马转化为n=3的情况,最后一定是我赢)
n=6 =3+3 Op first (相当于两个n=3 case的重复,此时应该让对手先)
n=7 =1+3+3 I first (这个不用解释了吧)
所以最后归纳出的策略就是:
n=number of sticks
if(n%3==0){OP first}
词
或者解法是不是:建立一个enum 把pattern里面每个字符对应一个质数,其他的字符对应成这些质数之后最小的质数,然后对pattern做乘法,留下乘积,然后留下为原pattern乘积倍数的词?
32. 写MyString class interface。
33. 被除数是一个用string表示的数,除数是一个long,返回string类型的结果, 要考虑结果为小数和无限小数的情况
34. popular value
35. missing range
36. One question is below, what is your solution for this? I think this problem is not difficult at not, right.. 鍥磋鎴戜滑@1point 3 acres
bob, joe, bob, jane, bob, joe, jack
bob = 3
joe = 2
topN(2) = bob, joe
solution: double-linked list and hashtable.
32. 判断一个int是不是旋转180度后还是原来的数字,比如16891还是16891,返回 true。
33. 给的例子:
Graph g = new Graph();
g.addEdge(“abb”, “cde”);
g.addEdge(“abb”, “ff”);
g.addEdge(“ff”, “abb”);. From 1point 3acres bbs
implement graph, addEdge,
之后 要求implement 一个cycle detection
三哥的没有明说的要求是这个graph里的node可以self point,也可以mult point to one node;
所以cycle detection最好是用recursive 的 DFS. (MD, 这点儿把老子整惨了)
n = k 就是 n = k - 2 左右个加一个数。
运用 Divide and Conquer 思想,一个旋转对称的数去掉头和尾还是对称。
33. 第一题: 实现搜索框的提示功能, 用户输入一个或者一部分字符后, 算法输出所有match的字符串.
给了三种方案, 一种是简单的直接brute force; 第二种是trie; 第三种是类似正则表达式的做法; 面试官说用trie来实现吧. 先构建出trie, 然后把搜索函数写出来. 没什么好说的 从头开始写
出来. 完成后写了个简单的test case, 和他一起过了一遍;实现时代码量有些多,用了大概二十多分钟. 主要包括trie class, buildTrie, find the fist Node in Tire, print out all paths
(strings) in trie四部分。
34. 第二题, deep copy linked list. 给了两种方案, 一是hashmap based, Time O(n) + Space O(n); 一是直接对List拆分拷贝 Time O(n) + Space O(1)。
35. Implement HashTable with get,set,delete,getRandom functions in O(1).
这题之前地里有人po过面经,楼主很幸运地当时认真实现过。。
重点在于2个hashmap+arraylist
36. Given a source word, target word and an English dictionary, transform the source word to target by changing/adding/removing 1 character at a time, while all
intermediate words being valid English words.
37. serializable interface
38. 给定两个排序好的数组, 返回两个数组中包含的相同的元素(merge sort中的merge就行)
39. valid parenthesis
40. 通配符, 给定输入字符串 01*0*, *可代表0或1,输出所有可能的结果
41. given a BST, find a way to serilize all values in one string, then write a function to translate the string back to the original tree
n1
/
ab h
/ /
m g2 cb
我是按照BFS的顺序 得到val, 然后没有children的地方 用[None] 表示。因为这个tree里面的所有val 都是 numerice and 字母,所以[None]不会混淆
得到 s = s = 'n1 ab h m [None] g2 cb ' 其中 为分隔符
42. Given two strings containing digits, return the one which represents the largest integer once the digits have been sorted in non-increasing order.
“245” -> 542
“178” -> 871
return 178
这题不是原题,没有见过,不过很简单。但是LZ过于紧张,写的时候有bug
做法是用两个长度10的数组来count在两个String里每位数字出现的次数,然后从9开始往后比,看看哪个不一样。input的string不是sorted的。给你了452和781一样返回781.因为按照降序排列后
到两个`就换成一个,单个`就是字符串的间隔符了。Interface给的List,不知道是ArrayList还是LinkedList,所以最好用iterator。
49. 给两个 range A [a1, a2), B [b1, b2)
找到numbers shows up in range A but not in range B
比如A [1, 2,3], B[3,4,5]
output [1, 2]. Waral 鍗氬鏈夋洿澶氭枃绔�,
讨论了如果 range 是连续的会怎么样, 如果不连续会怎么样
一开始我秀逗了, 非说连续的话要用(log n)
三姐也不点破, 就叫我写code, 写着写着我发现连续的话直接算边界的大小就可以了
50. We have an unordered list of Events from multiple sessions intermixed. Given this list (List), construct a new list containing only the latest Event for each
session.直接hash table就可以了,不需要priority queue
51. Write a function to detect whether a poker hand contains a “pair” (exactly 2 cards with the same value). use hash
52. determine whether the hand contains a “straight”: values are consecutive. sort or use hashset.
53. 这样的,两个input,第一个是一个机器的total_mem,第二个是一堆job,每个job包含starting_time,duration,mem_needed,mem_needed就是说这个工作需要这么多的memeory。要求是输
Index指示文件的位置,然后他让我按照这个思路写了decode 函数。之后又修改了代码的几个小地方。面试结束。
分隔符是 #s.length#, 如果string中有#的话,就把#变成##.
55. given two int arrays, determine whether one is permutation of the other。. From 1point 3acres bbs
做法很简单,先判断两个数组长度是否相同。之后对第一个数组建一个hashtable把所有出现的字符和出现的次数记录一下。然后扫一遍第二个数组,有相同的话就对应的出现次数减一。如果有字
符的出现次数变成负数,就是false。
56. construct a binary search tree from a sorted int array
这题对建立的树完全没要求,我还特意问了建的tree要不要balanced,面试官说无所谓。我还是取中间的数作为root,然后recrusively的处理左右子树。因为我建立node的时候用的都是root=new
只要在角度内都能看到。比如把摄像头放在0度的地方,那摄像头就能看到0到30度之内的所有点。
float GetBestDirection(float *arrX, float *arrY, int n, float f) {},arrX和arrY就是所有点的x和y坐标,n是一共n个点,然后f就是摄像机能看到多少的角度
先把所有点的angle算出来,排序,然后用2 pointer来扫描。
58. 题目的意思是,一个博物馆,有N乘以N个房间,每个房间有OPEN,CLOSED两种状态
如果CLOSED,说明房间不能进人也不能出人
如果OPEN,则可能有守卫在里面,也可能没有守卫
给定N的大小,还有哪些房间CLOSED,哪些房间有守卫
输出:一个N乘以N的矩阵,每个元素的值是这个房间距离最近的守卫的距离
用DP做,从每个守卫出发,然后DFS。
59. given 100 trillion longs, find the 100 largest of those longs. min heap, quick select
60. 第一题是Check whether two binary search trees have same elements,我一上来理解错题意了,以为是有一个相同的element就返回true,结果卡了大概十几分钟,后来才发现是所有的