百度上海云计算部门电话面试
时间:01时12分13秒
部门小组:偏向业务,订单系统,考查基础知识
1. 项目内容
- 社会网络分析系统
项目简单介绍
该项目给出了基于MapReduce的社会网络分析系统设计方案,包括进行社会网络分析所需的数据获取,数据格式转换,图处理和基于PageRank算法的社会网络分析算法的设计,实现了社会网络分析的完整过程,并利用多种社会网络通过对数据分析结果的图像化显示,为人们决策提供依据和建议。
本项目的主要工作在于设计了一套基于MapReduce的PageRank算法的社会网络分析的方案,包括:
1)数据的获取及格式处理:基于Web-Harvest数据抓取技术,从百度贴吧中抓取HTML信息,并进行格式转换处理。
2)处理社会网络信息:设计了一个社交网络用户信息网络的处理算法,用于处理将用户间的社会网络抽象为图,并对图中的点和边进行预处理,供后续PageRank算法使用。
3)基于MapReduce的PageRank的社会网络分析算法:利用基于X-RIME的PageRank算法在对用户信息进行处理,以及基于Hadoop的IKAnalyzer对主题信息进行处理,得出社会网络分析结论。利用采集到的社会化网站的用户信息和Pajek、Gephi分析工具对算法进行了实验验证。项目采用PageRank有所了解吗?其输出输出是怎么样的?
PageRank算法与社会网络分析相结合,发现用户在用户群中的地位高低可以通过用户关系网来反映。一个活跃用户或者核心用户在用户关系网中往往存在某些较高的指标值,利用PageRank就可以发现这一点。PageRank就是这样一种指标,它是一种常用的网也排名算法。我们可以将用户视为PageRank中的网页,而将用户之间的关系视为网络之间的链接关系,通过计算得到的用户rank 值就可以判断用户的活跃程度和核心程度,从而判断用户价值的高低。对于分析处理海量复杂的社会网络数据,项目采用PageRank算法与云计算相结合,高效处理数据。项目中采用的X-RIME中的PageRank算法.中文分词有考虑到同义词,重复,终止词的考虑吗?还记得当时的分词结果吗?
对于贴吧主题的分词可以分析出贴吧当前的热门词汇以及舆论趋势。在项目过程中,存在分词不准确、单字现象过多等问题,我们通过对于“IKAnalyzer.cfg.xml”,“stopword.dic”、“AppendDictionary.dic”增加分词词典规模和规则来改善分词效果。
- 智能快递箱系统
- 项目简单介绍
智能快递箱系统在FS_S5PC100开发平台实现,采用基于Ubuntu系统下的Qt作为开发工具,利用Qt设计实现系统各界面和功能,采用SQLite作为嵌入式平台系统数据库。智能快递箱系统结合条形码扫描枪和无线上网卡等设备,实现扫描自动输入快递单号以及取件和领取短信发送。智能快递箱系统系统通过交叉编译工具arm-none-linux-gnueabi分别交叉编译移植U-BOOT、Linux系统内核、文件系统、Qt和SQLite以及Tslib触摸屏构建FS_S5PC100嵌入式平台运行环境,智能快递箱系统移植到开发平台上实现快递人员投递快递、客户领取快递、短信发送、查询快递和系统初始配置等功能。智能快递箱后台管理系统采用JSP+Serlvet+JavaBean技术,遵循MVC三层架构开发模式,运用Eclipse进行开发,Tomcat作为服务器支持,连接智能快递箱的数据库进行数据访问。智能快递箱后台管理系统采用CSS+DIV布局,利用highcharts设计实现统计图表,实现包括系统人员管理、快递数据分析、查询快递物流信息等功能。 - 客户端和服务器端是分别自己所做的工作
见上。 - 客户端和服务器端是如何通信的
实话实说,操作也只是本地数据库,努力学习服务器之间的通信 - 数据是如何设计的
智能快递箱系统的数据库包含以下五个表,分别是admin、login、post、receive和box。
其中admin表用于记录系统管理人员的信息,包含用户名、密码和描述信息。login表用于记录快递人员的信息,包含用户ID、用户名、密码、所属公司;post表用于记录快递投递的信息,包含快递单号、收件人手机号码、快递人员名称、投递时间、投递状态、投递快递箱号;receive表用于记录快递领取的信息,包含快递单号、收件人电话号码、取件密码、领取时间、领取状态。box表用于记录快递箱使用情况的信息,包含箱子ID、箱子类型、快递单号、箱子使用状态。
2. Java内容
- 知道Java的反射吗?运用场景?
- 指的是可以于运行时加载,探知和使用编译期间完全未知的类.
- 程序在运行状态中, 可以动态加载一个只有名称的类,对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;
- 加载完类之后,在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象),这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射。
- Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义,下面是最主要的三个反射类:Constructor:类的构造函数反射类;Method:类方法的反射类;Field:类的成员变量的反射类;
- a、Java的反射机制就是增加程序的灵活性,避免将程序写死到代码里。
- b、增加程序的灵活性。
- 反射一般在框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。hibernate、struts都是用反射机制实现的。
- 了解Spring在SSH中的作用和实现原理?画图说明
- spring的作用就相当于将struts和hibernate连接起来,是将两个没有关系的框架的特性,方法,action都放在spring的配置文件中使他们建立关系。取他门各自所长。而这些做法他们自己不知道,他们是听命于spring调度的,他的的任务只是做好自己的事情。
3. 编程内容
- 给出int start 和 int end ,写出方法,返回范围内素数的个数
/**
* Get all the number of prime numbers between start and end
* @author Administrator
*
*/
import java.util.ArrayList;
import java.util.List;
public class ComputeRangePrimeNumber {
public static List<Integer> showPrimeNumber(int start, int end) {
List<Integer> primeNumbers = new ArrayList<Integer>();
int tempSqrt = 0;
boolean isPrimeNumber = true;
for (int i = start; i < end; i++) {
isPrimeNumber = true;
if (i > 3) {
tempSqrt = (int) Math.sqrt(i);
for (int j = 2; j <= tempSqrt; j++) {
if (i % j == 0) {
isPrimeNumber = false;
}
}
} else if (i < 2) {
isPrimeNumber = false;
} else {
isPrimeNumber = true;
}
if (isPrimeNumber) {
primeNumbers.add(i);
}
}
return primeNumbers;
}
public static void main(String[] args){
int start=1;
int end=1000;
List<Integer> numlist =new ArrayList<Integer>();
numlist = showPrimeNumber(start,end);
System.out.println(String.format("%d--%d之间的素数的个数是:%d",start,end,numlist.size()));
}
}
- 说出时间复杂度?如何优化?
O(n^2),优化就是数学理论问题了。
代码格式编写参考http://blog.csdn.net/hellokobe/article/details/51931408
发现用List的话,既可以保存数据,又可以方便统计个数,Get到了。 - 给出字符串(汉字)“壹仟叁佰贰拾万”如何转换为long型数字?
- 字符串只有一到九的汉字数字和十百千万亿,单位不会连续可以重复出现
import java.util.HashMap;
import java.util.List;
/**
* 用作汉字转换成数字的类
*
* @author andre1989@sina.com
* @version 1.1
*/
public class NumTranslate {
private static HashMap<String, Long> theMap = new HashMap<String, Long>() {
private static final long serialVersionUID = 1L;
{
put("零", 0L);
put("一", 1L);
put("壹", 1L);
put("二", 2L);
put("贰", 2L);
put("三", 3L);
put("叁", 3L);
put("四", 4L);
put("肆", 4L);
put("五", 5L);
put("伍", 5L);
put("六", 6L);
put("陆", 6L);
put("七", 7L);
put("柒", 7L);
put("八", 8L);
put("捌", 8L);
put("九", 9L);
put("玖", 9L);
put("十", 10L);
put("拾", 10L);
put("百", 100L);
put("佰", 100L);
put("千", 1000L);
put("仟", 1000L);
put("万", 10000L);
put("亿", 100000000L);
}
};
public static long translateToNum(String s) {
// 中间及最终结果
long result = 0;
// 当前汉字代表的数值
long num = 1;
// 前一汉字的数值
long flag = 1;
// 当数值过亿时一亿以上的数值
long k = 0;
for (int i = 0; i < s.length(); i++) {
String slice = s.substring(i, i + 1);
if (theMap.get(slice) == null) {
return 0;
}
if (theMap.get(slice) == 0) {
continue;
}
if (theMap.get(slice) < 10) {
num = theMap.get(slice);
if (i == s.length() - 1) {
result += num;
return result + k;
}
} else if (theMap.get(slice) >= 10000) {
// 当中间结果不为0并且前一数值是十的倍数时,可直接相乘
if (result != 0 && flag % 10 == 0) {
result *= theMap.get(slice);
} else {
result = (result + num) * theMap.get(slice);
}
if (theMap.get(slice) == 100000000) {
k = result;
result = 0;
}
} else {
result += num * theMap.get(slice);
}
flag = theMap.get(slice);
}
return result + k;
}
public static void main(String[] args) {
List<String> chnList = new java.util.ArrayList<String>();
chnList.add("一");
chnList.add("十");
chnList.add("一十五");
chnList.add("十五");
chnList.add("二十");
chnList.add("二十三");
chnList.add("一百");
chnList.add("一百零一");
chnList.add("一百一十");
chnList.add("一百一十一");
chnList.add("一千");
chnList.add("一千零一");
chnList.add("一千零三十一");
chnList.add("一万零一");
chnList.add("一万零二十一");
chnList.add("一万零三百二十一");
chnList.add("一万一千三百二十一");
chnList.add("三千零十五万");
chnList.add("三千零一十五万");
chnList.add("三千五百六十八万零一百零一");
chnList.add("五十亿三千零七十五万零六百二十二");
chnList.add("十三亿三千零十五万零三百一十二");
chnList.add("三千零七十八亿三千零十五万零三百一十二");
chnList.add("一千二百五十八亿");
chnList.add("一千二百五十八万亿零三千三百二十一");
for (String chnStr : chnList) {
System.out.println((translateToNum(chnStr)));
}
}
}
- 如何测试你写的代码是否正确可用?
4. 自己的问题
- Java基础不牢
- 要注重代码可读性和可用性
- 基础很重要