第一次做阿里筆試題,除了ACM題之外從來沒有做過校招網(wǎng)絡(luò)題呀,完全是裸考,總體感覺吧,對于我來說,感覺時間不夠用,不是題不會,感覺時間緊,大腦很混亂,總結(jié)這一次的筆試題
廢話不多說,直接上題和答案
平均每個人逗留時間為20分鐘,那么開場前20分鐘一共來了400人,且有20個人逗留時間已經(jīng)到,但他們不一定出去,注意是平均時間,所有博物館最少應(yīng)該容納500人
雙向循環(huán)列表,從任何一個元素開始可以遍歷全部元素
先和后面的元素相連
s->next=p->next;
p->next->prev=s->next;
在前面的元素相連
p->next=s;
s->pre=p;
答案顯而易見
畫圖可以實現(xiàn)
時間輪轉(zhuǎn)為1秒
A 24
B 20
C 7
D14
總時間為73所以平均周轉(zhuǎn)時間為16.25
有兩種坐的方式
動態(tài)分配都在堆中,毋容置疑
Yield()暫時交出cpu控制權(quán),從running狀態(tài)轉(zhuǎn)為runnalbe狀態(tài),但是仍有可能被調(diào)度,sleep()線程指定休眠一段時間wait()在其他線程調(diào)用此對象的notify()notifyAll()方法時才能繼續(xù)執(zhí)行線程中sleep()方法和yeild()方法的主要區(qū)別
: 1.sleep()
方法會給其他線程運行的機會,而不管其他線程的優(yōu)先級,因此會給較低優(yōu)先級的線程運行的機會;yeild()方法只會給優(yōu)先級相同的或者比自己高的線程運行的機會2.sleep()方法聲明拋出InterruptionException異常,而yeild()方法沒有聲明拋出任何異常3.sleep()方法比yeild()方法具有更高的可移植性4.sleep()方法使線程進入阻塞狀態(tài)yeild()方法使線程進入就緒狀態(tài)當前運行的線程可以調(diào)用另一個線程的join()方法,當前運行的線程將轉(zhuǎn)到阻塞狀態(tài)直到另一個線程運行結(jié)束,它才會恢復(fù)運行 join()有兩種形式:public void join()和public void join(long timeout)可以設(shè)置阻塞的時間
sleep()方法進入阻塞狀態(tài),當有兩個線程(線程1和線程2),線程1的優(yōu)先級比線程2的優(yōu)先級高,線程1sleep()則線程2可以獲得運行機會
當有比當前線程優(yōu)先級高的線程出現(xiàn)時,高優(yōu)先級會搶占CPU并運行,yield()方法,暫停一段時間,且這段時間不確定,它會使與當前線程相同優(yōu)先級的線程獲得運行機會
具有相同優(yōu)先級的多個線程調(diào)度不一定是分時的,多核CPU可能同時調(diào)度
首先選擇排序、插入排序、冒泡排序時間復(fù)雜度為 O(n^2)
快速排序最壞排序為時間復(fù)雜度O(n^2)
堆排序需要知道是大頂堆或者小頂堆,因為不了解數(shù)列特征所以不推薦其復(fù)雜度為O(nlgn);
所以快排是最優(yōu)的
TCP/IP建立在三次握手協(xié)議基礎(chǔ)上
前提條件是,虛擬機發(fā)生故障當且僅當它的宿主發(fā)生故障
根據(jù)條件得出虛擬機發(fā)生故障則物理機發(fā)生故障,則這臺物理機所虛擬出的虛擬機會發(fā)生故障,所以虛擬機發(fā)生的故障不是彼此獨立的,單臺虛擬機的故障率和單臺物理機的故障率是相同的,如果組成集群,那么當某個虛擬機發(fā)生故障時,另一個虛擬機會代替發(fā)生故障的虛擬機運行,所以可靠性比5臺物理機的可靠性相同,所以無法判斷這一百臺虛擬機和100臺物理機哪個更可靠
附加題1
sleep()和wait()的區(qū)別
sleep()是讓進程休眠一段時間,sleep()休眠持有鎖,不釋放系統(tǒng)資源,時間過后自動醒來進入可運行狀態(tài),但不一定執(zhí)行,取決于虛擬機的調(diào)度,sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調(diào)用interrupt()強行打斷。
wait是進入線程等待池等待,出讓系統(tǒng)資源,其他線程可以占用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再notify()也沒用,要等待其他線程調(diào)用notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統(tǒng)資源。
使用范圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
附加題2
大意,插入一個二叉樹,求二叉樹最大節(jié)點和最小節(jié)點的絕對值
java 代碼如下
//樹節(jié)點
public class TreeNode1 {
private TreeNode1 leftChild;
private TreeNode1 rightChild;
int intege;
public TreeNode1 getLeftChild() {
return leftChild;
}
public void setLeftChild(TreeNode1 leftChild) {
this.leftChild = leftChild;
}
public TreeNode1 getRightChild() {
return rightChild;
}
public void setRightChild(TreeNode1 rightChild) {
this.rightChild = rightChild;
}
public int getIntege() {
return intege;
}
public void setIntege(int intege) {
this.intege = intege;
}
public TreeNode1(int intege) {
super();
this.intege = intege;
}
}
二叉樹
public class Btree1 {
private int max;
private int min;
public Btree1(int max, int min) {
super();
this.max = max;
this.min = min;
}
//構(gòu)造二叉樹
public void insert(TreeNode1 root, int i) {
if (root == null) {
System.out.println("樹為空");
} else {
if (root.getIntege() < i) {
if (root.getLeftChild() != null) {
insert(root.getLeftChild(), i);
} else {
root.setLeftChild(new TreeNode1(i));
}
} else {
if (root.getRightChild() != null) {
insert(root.getRightChild(), i);
} else {
root.setRightChild(new TreeNode1(i));
}
}
}
}
插入二叉樹,遍歷找到節(jié)點最大值和最小值
public void FindMax_Min(TreeNode1 root) {
if (root == null) {
System.out.println("該樹為空");
} else {
if(root.getIntege()>max)
{
max=root.getIntege();
}
if(root.getIntege()<min)
{
min=root.getIntege();
}
//System.out.println(root.getIntege() + " ");
if (root.getLeftChild() != null) {
FindMax_Min(root.getLeftChild());
}
if (root.getRightChild() != null) {
FindMax_Min(root.getRightChild());
}
}
}
public void Max_Min_abs()
{
System.out.println(max-min);
}
public static void main(String[] args) {
int a[]={1,45,6,7,12,89,2,17};
Btree1 b=new Btree1(-10000,10000);
TreeNode1 treeNode1=new TreeNode1(a[0]);
for(int i=1;i<a.length;i++)
{
b.insert(treeNode1, a[i]);
}
b.FindMax_Min(treeNode1);
b.Max_Min_abs();
}
}
附加題3
求兩個字符串最大的連續(xù)出現(xiàn)的公共部分 列如query為acbac,text為acaccbabb那么公共子串為cba 長度為3
下面為java代碼編寫
import java.util.Scanner;
public class FindMaxSubString {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("請輸入query");
/*String str1 = "acbac";
String str2 = "acaccbabb";
*/
String str1=s.nextLine();
System.out.println("請輸入text");
String str2=s.nextLine();
String result = getMaxString(str1, str2);
if(result!=null)
{
System.out.println(result.length());
}
else
{
System.out.println("沒有公共子串");
}
}
private static String getMaxString(String str1, String str2) {
String max = null;
String min = null;
max = (str1.length() > str2.length() ? str1 : str2);
min = max.equals(str1) ? str2 : str1;
for (int i = 0; i < min.length(); i++) {
for (int start = 0, end = min.length() - i; end != min.length() + 1; start++, end++) {
String sub = min.substring(start, end);
if (max.contains(sub))
return sub;
}
}
return null;
}
}
本人做的,可能有不對的,希望大家提出啊,持續(xù)更新中