第一次做阿里筆試題,除了ACM題之外從來沒有做過校招網絡題呀,完全是裸考,總體感覺吧,對于我來說,感覺時間不夠用,不是題不會,感覺時間緊,大腦很混亂,總結這一次的筆試題
廢話不多說,直接上題和答案
平均每個人逗留時間為20分鐘,那么開場前20分鐘一共來了400人,且有20個人逗留時間已經到,但他們不一定出去,注意是平均時間,所有博物館最少應該容納500人
雙向循環列表,從任何一個元素開始可以遍歷全部元素
先和后面的元素相連
s->next=p->next;
p->next->prev=s->next;
在前面的元素相連
p->next=s;
s->pre=p;
答案顯而易見
畫圖可以實現
時間輪轉為1秒
A 24
B 20
C 7
D14
總時間為73所以平均周轉時間為16.25
有兩種坐的方式
動態分配都在堆中,毋容置疑
Yield()暫時交出cpu控制權,從running狀態轉為runnalbe狀態,但是仍有可能被調度,sleep()線程指定休眠一段時間wait()在其他線程調用此對象的notify()notifyAll()方法時才能繼續執行線程中sleep()方法和yeild()方法的主要區別
: 1.sleep()
方法會給其他線程運行的機會,而不管其他線程的優先級,因此會給較低優先級的線程運行的機會;yeild()方法只會給優先級相同的或者比自己高的線程運行的機會2.sleep()方法聲明拋出InterruptionException異常,而yeild()方法沒有聲明拋出任何異常3.sleep()方法比yeild()方法具有更高的可移植性4.sleep()方法使線程進入阻塞狀態yeild()方法使線程進入就緒狀態當前運行的線程可以調用另一個線程的join()方法,當前運行的線程將轉到阻塞狀態直到另一個線程運行結束,它才會恢復運行 join()有兩種形式:public void join()和public void join(long timeout)可以設置阻塞的時間
sleep()方法進入阻塞狀態,當有兩個線程(線程1和線程2),線程1的優先級比線程2的優先級高,線程1sleep()則線程2可以獲得運行機會
當有比當前線程優先級高的線程出現時,高優先級會搶占CPU并運行,yield()方法,暫停一段時間,且這段時間不確定,它會使與當前線程相同優先級的線程獲得運行機會
具有相同優先級的多個線程調度不一定是分時的,多核CPU可能同時調度
首先選擇排序、插入排序、冒泡排序時間復雜度為 O(n^2)
快速排序最壞排序為時間復雜度O(n^2)
堆排序需要知道是大頂堆或者小頂堆,因為不了解數列特征所以不推薦其復雜度為O(nlgn);
所以快排是最優的
TCP/IP建立在三次握手協議基礎上
前提條件是,虛擬機發生故障當且僅當它的宿主發生故障
根據條件得出虛擬機發生故障則物理機發生故障,則這臺物理機所虛擬出的虛擬機會發生故障,所以虛擬機發生的故障不是彼此獨立的,單臺虛擬機的故障率和單臺物理機的故障率是相同的,如果組成集群,那么當某個虛擬機發生故障時,另一個虛擬機會代替發生故障的虛擬機運行,所以可靠性比5臺物理機的可靠性相同,所以無法判斷這一百臺虛擬機和100臺物理機哪個更可靠
附加題1
sleep()和wait()的區別
sleep()是讓進程休眠一段時間,sleep()休眠持有鎖,不釋放系統資源,時間過后自動醒來進入可運行狀態,但不一定執行,取決于虛擬機的調度,sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。
wait是進入線程等待池等待,出讓系統資源,其他線程可以占用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再notify()也沒用,要等待其他線程調用notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統資源。
使用范圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
附加題2
大意,插入一個二叉樹,求二叉樹最大節點和最小節點的絕對值
java 代碼如下
//樹節點
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;
}
//構造二叉樹
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));
}
}
}
}
插入二叉樹,遍歷找到節點最大值和最小值
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
求兩個字符串最大的連續出現的公共部分 列如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;
}
}
本人做的,可能有不對的,希望大家提出啊,持續更新中