整理了几道阿里巴巴真题,来试试自己水平有多厉害吧,每题还有答案和详细解答哦。
1、有个特殊的餐厅,对客人的要求是如果要离开餐厅一定要看下餐厅内有没有比你迟进来的人,一定要所有比你迟进来的人离开后你才能离开,有一天甲,乙,丙,丁四个客人先后进入了这家餐厅,那么他们离开的顺序不可能是:
A:丙,乙,甲,丁
B:甲,乙,丙,丁
C:乙,甲,丙,丁
D:乙,丙,甲,丁
E:丁,丙,甲,乙
F:丁,丙,乙,甲
本题考查的是元素入栈出栈的顺序问题。但要小心一个思维误区:并不是要等到甲、乙、丙、丁全部按序进入餐厅后才开始有人离开。 答案:E。
2、在关系型数据库中,有两个不同的事务同时操作数据库中同一表的同一行,不会引起冲突的是:
A:其中一个DELETE操作,一个是SELECT操作
B:其中两个都是UPDATE
C:其中一个是SELECT,一个是UPDATE
D:其中一个是DELETE,另一个是UPDATE
E:两个都是DELETE
当要删除的记录在数据库中不存在的时候,是不会报错的。答案:E。
3、设一组初始关键字为( 12,15,1,18,2,35,30,11 ),则以 12 为基准记录的一趟快速排序结束后的结果为:
A:11,1,2,12,35,18,30,15
B:11,2,1,12,15,18,35,30
C:1,2,11,12,15,18,35,30
D:11,2,1,12,18,35,30,15
E:1,2,11,12,15,18,30,35
快速排序里的挖坑填补法:以12为标准值,从右开始找比12小的值,首先是11,把11放在12的位置,把12放在11的位置,再从左找比12大的值15,把15放在12的新位置(原11的位置)之后变成 11,12,1,18,2,35,30,15。
在新的一轮开始,从右开始找比12 小的数是2,把2放在12的位置,12放在2的位置,在从左找比12大的数18,把18放在12的新位置上(原2的位置)变成11,2,1,12,18,35,30,15。答案:D。
4、以下程序的运行结果是?
public class TestThread{
public static void main(String args[]){
Runnable runner = new Runnable(){
@Override
public void run(){
System.out.print('foo');
}
};
Thread t = new Thread(runner);
t.run();
System.out.print("bar");
}
}
A:foobar
B:barfoo
C:foobar或者barfoo都有可能
D:Bar
E:Foo
F:程序无法正常运行
这道题是考线程的调用情况,线程的启动方式只能通过start这种方式启动才能真正的实现多线程的效果,如果是手动调用run方法和普通方法调用没有区别,所以这个还是按照顺序执行首先执行run方法之后,执行输出语句所以最终得到结果foobar。答案:A。
5、一个二叉树有100个子节点数为2的节点,100个子节点数为1的节点,那么子节点数为0的节点(叶节点)的个数为:
A:101
B:100
C:200
D:300
E:99
F:1
度数(边数) = 所有节点数-1,这里度数=2*100+100=300,节点数=100+100+叶子节点数。所以叶子节点数=度数+1-非叶子节点数=101。答案:A。
6、现有1G数据需要排序,计算资源只有1G内存可用,下列排序方法中最可能出现性能问题的是。
A:堆排序
B:插入排序
C:归并排序
D:快速排序
E:选择排序
F:冒泡排序
答案:C
7、某开发团队有6位开发同学,需参加5个项目, 每个项目都有人做 ,每位同学需要恰好参加1个项目,那么总共有 种不同的分配方案。
A:3600
B:3600
C:2700
D:1800
E:900
F:30
C6 2 *A5 5,先对人分组,也就是6个人分5组,则必有1个组有两个人,其他组1人。然后每组对应一个项目。答案:D 。
8、建立和关闭一个 tcp ,一共会产生的握手次数是()
A:7 B:6 C:3 D:5
建立的三次握手加关闭的四次握手。答案:A。
9、学校图书馆共有 300 万册图书,想统计其中 Computer 、Science、计算机、科学这几个词出现的次数,并按照自然年度分类,如 2016 年出版的书籍中这几个词各自出现的次数, 2015 年……依次类推。
将每本书都存在hdfs里作为一个文件,文件名为 时间(4位年份)+书的id+书的名称。使用mapreduce进行运算,map输出为<日期,computer次数;science次数;计算机次数;科学次数>,reduce输出同样,不过作为value的字符串中的次数为总次数。代码如下:
public static class MyMapper extends Mapper{
private static Text outputKey = new Text();
private static Text outputValue = new Text();
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
//得到hdfs文件名
String filename = ((FileSplit) context.getInputSplit()).getPath().getName();
String date = filename.substring(0, 4);
//分别统计computer,science,计算机,科学出现的次数
int computer = 0;
int science = 0;
int jisuanji = 0;
int kexue = 0;
String line = value.toString();
String[] words = line.split(" ");
for(String s:words){
if(s.equals("computer")) computer++;
if(s.equals("science")) science++;
if(s.equals("计算机")) jisuanji++;
if(s.equals("科学")) kexue++;
}
String outputVal = "" + computer + ";" + science + ";" + jisuanji + ";" + kexue;
outputKey.set(date);
outputValue.set(outputVal);
context.write(outputKey, outputValue);
}
}
public static class MyReducer extends Reducer {
@Override
protected void reduce(Text key, Iterable values,Context context)
throws IOException, InterruptedException {
int allComputer = 0;
int allScience = 0;
int allJisuanji = 0;
int allKexue = 0;
for(Text value:values){
String val = value.toString();
String[] str = val.split(";");
allComputer += Integer.parseInt(str[0]);
allScience += Integer.parseInt(str[1]);
allJisuanji += Integer.parseInt(str[2]);
allKexue += Integer.parseInt(str[3]);
}
String finalVal = "" + allComputer + ";" + allScience + ";" + allJisuanji + ";" + allKexue;
context.write(key, new Text(finalVal));
}
}
10、以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。(字符串长度不大于10000,保证字符串仅由’0’~'9’这10种字符组成)。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
int len1 = s.length();
int len2 = t.length();
int[] nums1 = new int[len1];
int[] nums2 = new int[len2];
for(int i = 0; i < len1; i++){
nums1[i] = s.charAt(i) - '0';
}
for(int i = 0; i < len2; i++){
nums2[i] = t.charAt(i) - '0';
}
int[] result = new int[len1 + len2];
// 1. 逐位相乘
for(int i = 0; i < len1; i++){
for(int j = 0; j < len2; j++){
result[i + j] += nums1[i] * nums2[j];
}
}
// 2. 从后往前进位
for(int k = result.length - 1; k > 0; k--){
result[k - 1] += result[k] / 10;
result[k] = result[k] % 10;
}
// 输出字符串
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < result.length - 1; i++){
stringBuilder.append(result[i]);
}
return stringBuilder.toString();
}
}
上面的笔试题你做对了几道?如果你觉得看得不过瘾,我给大家准备了一套阿里“有史以来”最新最全Java面试真题(覆盖 P5-P8 级别)如有需要点击此处即可免费领取,无套路。