第一次踏出校门来北京面试,第一家公司,巨紧张,凉。
一、面试流程
1.自我介绍
2.二叉树的中序遍历并实现(手写代码)
3.手写代码(一个题,描述放在题解部分,应该是字符串处理,菜狗表示实在想不到什么更好的优化)
4. 1T的数据文件,一台100G的机器,如何找出重复第二多的行?
二、面试题解
1.二叉树的中序遍历并实现
参考他的https://blog.youkuaiyun.com/coder__666/article/details/80349039
总结:
序即根, 前序:根左右
中序:左根右
后序:左右根
我居然忘了。。。忘了。。。把前序当中序了,服了我自己了。难道紧张的啥都能忘。。。
2.字符串处理问题
规则:
1
11
21
1211
111221
312211
13112221
。。。
输入行号
给出输出
例:
4
1211
分析:感觉就是一个字符串处理的问题,读上一行,产生下一行。
代码如下:
package offer;
import java.util.Scanner;
/*字符串处理的题
规则:
1
11
21
1211
111221
312211
。。。
输入行号
给出输出
例:
4
1211
*/
public class StringDemo {
public static String result(int n){
n=n-1;
String str="1";
for(int i=0;i<n;i++){
str=read(str);
}
return str;
}
public static String read(String str){
StringBuilder sb=new StringBuilder();
for(int i=0;i<str.length();i++){
int count=1;
while(i+1<str.length()&&str.charAt(i)==str.charAt(i+1)){
count++;
i++;
}
String sc=String.valueOf(count);
sb.append(sc);
sb.append(str.charAt(i));
}
return sb.toString();
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String re=result(n);
System.out.println(re);
}
}
新手请各位大佬,看看还有没有什么可以优化的或更好的解决办法。
3.1T的数据文件,每一行都是一个常规的字符串,不是过大的那种,一台100G的机器,如何找出重复第二多的行?
思路:联想mapreduce处理流程
分治:(1)顺序读文件,将文件的每一行字符串都当作key,用key的hashcode对100取余,然后按照这个值分到各个小文件中,这样每一个文件平均10G,最大的那个应该不能超过100G,如果还有超过100G的就继续分。(partition)
(2)对每个小文件,统计每个文件中出现的词及相应的频率(用字典树或HashMap)(combiner)
(3)然后对这些文件进行合并(合并时按key归并排序,可以提高效率)再次,然后按(value即出现的次数)进行排序。
这样就只有一个mapTask就解决了问题。
同样,希望大家多多指教和讨论。
给自己的一句话:先得到可行解,再迭代优化----------迭代开发