搜狐大数据开发实习面试

第一次踏出校门来北京面试,第一家公司,巨紧张,凉。
一、面试流程
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就解决了问题。

同样,希望大家多多指教和讨论。

给自己的一句话:先得到可行解,再迭代优化----------迭代开发

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值