我在北京找工作(六):備戰阿里巴巴java筆試:前人的阿里總結

1.      假設有Alibaba網站最近一個月的查詢日誌,記錄了用戶的查詢行爲,每條查詢都至少包含有一個產品詞,稱之爲查詢意圖,總計有查詢意圖3000萬條,請統計出這3000萬條。

 

2.      爲了保護我們的地球,全世界都在倡導綠色環保,在高效能計算和綠色計算方面,請談談你的一些想法。

 

3.      聊聊最近最吸引你的互聯網事件,談談你對此事件的看法。

 

4.      在進入我的淘寶頁面時,此頁面需要獲取登陸的用戶相關信息。在訪問量少的情況下,可以採用直接訪問數據庫的方式;但當訪問量太高時,會導致數據庫壓力過高,因此通常採取的方法爲將用戶信息進行緩存。在用戶數不多的情況下,這個方案還是提供了很大的幫助的;但用戶數增多了一點後,出現的問題就是緩存佔用了太多的內存,而經過分析,原因是這些緩存中有很多是不訪問的用戶信息。

1.1 請寫一段存儲用戶信息的緩存實現代碼,並實現緩存到達一定大小後,如繼續新增用戶信息,則將最近不訪問的用戶信息從緩存中踢出。

1.2由於我的淘寶是部署在多臺機器上的,如果用戶每次訪問不同的機器,以上方案會造成每臺機器都需要去數據庫中加載此用戶信息,請給出一個方案來避免此問題。

 

5.      有阿里巴巴每層辦公室茶水間都有一臺飲料自動販賣機,可選飲料包含有奶茶,咖啡,果珍等,由於是公司福利不需要投幣即可私用,先假定每層員工爲500名,請寫出針對飲料自動販賣機的測試方法。

 

6.      你接觸過哪些LINUX發行版,請比較一下這些發行版的優缺點。

 

7.      用3個關鍵詞表現你想從阿里巴巴得到什麼?

興趣,夢想,成功

8.      連接兩個單向鏈表,返回排序後的結果。

9.      c語言能否進行面向對象的設計和編程?爲什麼?如果可以,怎麼實現?

10.  extjs裏對一個支持事件監聽的控件,取出監聽器的方法有哪些?

11.  Apach Web Server區別於其他應用服務器的主要特點是什麼?

12.  Java的特點是什麼?

13.  Web層的主要作用?

14.  五種顏色塗到一個田字格里,相鄰兩個格子的顏色不能相同,顏色可以重複使用。問你一共有多少種塗法?

15.  一天24小時內,時針、分針、秒針一共重合多少次?

16.  一個牧場的草,10頭牛可以喫20天,15頭牛可以喫10天,並且每天牧場的草都是均勻的生長,問你25頭牛可以喫多少天?

17.  菲波納契數列f(i)11235.。。。。問你f(50)-1最少可以寫成多少個菲波納契數之和?

18.  提高網絡安全你有什麼建議?

19.  對下一代互聯網你有什麼設計?

20.  在平面上有n個點,(x1,y1),(x2,y2)...(xn,yn),請用最快的算法找到是否有三個點共線。

21.  關於圖片文件存儲的一個開放性的題目。

22.  有一顆樹,每一個樹節點存儲着一個數字,現在想要找到兩個相同的節點(這兩個節點存儲的數字及其所有子樹均相等)。[查找樹中相同節點對]

思路1:

1)    首先通過一個遍歷(如前序遍歷)得到一個數字序列,並對樹中的葉

子節點在這個序列中做標記(現在問題退化爲在一個數字串中找出重

復的字符串,且這些字符串應該是以標記的葉子節點結尾的)。

2)    採用後綴樹可以很方便的求得相同的數字串序列。

3)    驗證2)中得到的結果(應該是一個小結果集) 是否滿足要求,驗證

的時間複雜度應該是比較小的。

思路2:

1)    對樹中的每一個節點設定一個權值,這個權值爲其所有子節點的權值

及其自身數字值之間的乘積(可能需要bignumber,或者考慮將這些

數字進行移位異或)。

2)    採用後序遍歷,計算每一個節點的權值,並順帶記錄其樹深度。統計

權值和深度均相同的節點。

​3) 驗證2)中得到的結果是否滿足要求,驗證的時間複雜度應該是比較

小的。

23.  參加百年阿里培訓的N位同學結伴去西湖旁邊爲遊人指路,兩人一組,他們打算先讓體重之和恰好爲102公斤的同學一組,請給出一個算法找到這樣的組合,或者確定他們之間不存在這樣的組合,其中最有的算法複雜度爲?(假設體重恰好爲整數)

------解決方案--------------------------------------------------------
比如A B C D E,其中2*C = F,則以C爲分割點,兩邊對稱取組合,滿足要求了

------解決方案--------------------------------------------------------
(a)從小到大排序成大小爲n的數組Array
(b)定義下標i=0, j=n-1
(c)若Num=Array[i]+Array[j],則輸出,且i++,j--;
 若Num>Array[i]+Array[j],則i++;
 若Num<Array[i]+Array[j],則j--
(d)若i<j,則轉至第3步;否則結束(找出分割點

24.  簡述隱馬爾可夫模型(HMM)的三個基本問題。

令 λ = {A,B,π} 爲給定HMM的參數,σ = O1,...,OT 爲觀察值序列, 隱馬爾可夫模型(HMM)的三個基本問題爲:

(1)    評估問題:對於給定模型,求某個觀察值序列的概率p(σ|λ) ;

向前算法 (a)定義向前變量(b)採用動態規劃算法,複雜度  。

(2)    解碼問題:對於給定模型和觀察值序列,求可能性最大的狀態序列;

       韋特比(Viterbi)算法 (a)採用動態規劃算法,複雜度 。

(3)    學習問題:對於給定的一個觀察值序列,調整參數λ,使得觀察值出現的概率p(σ|λ)最大;

向前向後算法  (a)EM算法的一個特例,帶隱變量的最大似然估計。
     隱馬爾科夫模型(hidden Markov model,縮寫爲HMM)的提出最初是在語音處理領域。HMM是在Markov鏈的基礎上發展起來的一種統計模型。由於實際問題比Markov鏈模型所描述的更爲複雜,因此在HMM中觀察到的事件與狀態並不是一一對應,而是與每個狀態的一組概率分佈相聯繫。它是一個雙重隨機過程,其中之一是Markov鏈,描述狀態的轉移;另一個描述每個狀態和觀察值之間的統計對應關係。這樣,HMM以概率模型描述觀察值序列,具有很好的數學結構,能夠比較完整地表達觀察值序列的特徵。

評估問題:對於給定模型,求某個觀察值序列的概率p(σ|λ) ;

解碼問題:對於給定模型和觀察值序列,求可能性最大的狀態序列;

學習問題:對於給定的一個觀察值序列,調整參數λ,使得觀察值出現的概率p(σ|λ)最大。

HMM的狀態是不確定或不可見的,只有通過觀測序列的隨機過程才能表現出來;觀察到的事件與狀態並不是一一對應,而是通過一組概率分佈相聯繫;HMM是一個雙重隨機過程。

25.  有兩個有序整數集合a,b。請寫一個函數,實現找出a,b集合中的交集,並打印出來。(見試卷)

26.  分析Merge Sort的原理及算法複雜度,並用最擅長的編程實現MergeSort。

原理:“歸併”的含義是將兩個或兩個以上的有序表組合成一個新的有序表。假設初始序列含有n個記錄,則可看成是n個有序的子序列,每個子序列的長度爲1,然後兩兩歸併,得到 個長度爲2或者1的有序子序列;再兩兩歸併,……,如此重複,直至得到一個長度爲n的有序序列爲止,這種排序方法稱爲2-路歸併排序。它的核心操作是將一維數組中前後相鄰的兩個有序序列歸併爲一個有序序列。

算法複雜度和編程見筆記。

27.  給定一個數t,以及n個整數,在這n個數找到加和爲t的所有組合,例如t=4,n=6,這6個數爲【4,3,2,2,1,1】,這樣輸出就有4個不同的組合他們的加和爲4:4,3+1,2+2 and 2+1+1,請設計一個高效算法實現這個需求。

http://blog.chinaunix.net/space.php?uid=22753395&do=blog&id=1769851

(a)解題思路

先將數據按從大到小進行排序,然後使用回溯法遍歷所有可能。注意去掉重

復的結果。

(b)代碼實現

#include<iostream>
using namespace std;
int a[100]={4,3,1,2,1,2};
bool x[100];//標記第i個元素是否已經使用
int N=6;//元素個數
int t=4;//目標和
int sum;//當前和
int cmp(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}
void backtrace(int n)
{
    if(sum>t)//當前和大於t
        return ;
    if(sum==t)//當前和等於t,輸出結果
    {
        for(int j=0;j<n;++j)
        {
            if(x[j])
                cout<<a[j]<<" ";
        }
        cout<<endl;
        return;
    }
    if(n==N)//超過n層
        return ;
    for(int i=n;i<N;++i)
    {
        if(x[i]==false)//未使用
        {
            x[i]=true;
            sum+=a[i];
            backtrace(i+1);
            x[i]=false;
            sum-=a[i];
            while(i<N-1 && a[i]==a[i+1])//跳過相同的
                i++;
        }
    }
}
int main()
{
    sum=0;
    memset(x,0,sizeof(x));
    qsort(a,N,sizeof(a[0]),cmp);
    backtrace(0);
    return 0;
}

28.  抽象類和接口的區別

29.  用戶級線程和核心級線程的區別是什麼?

(1)用戶線程:由應用進程利用線程庫創建和管理,不來於操作系統核心。不需要用戶態/核心態切換,速度快。操作系統內核不知道多線程的存在,因此一個線程阻塞將使得整個進程(包括它的所有線程)阻塞。

(2)內核線程: 由操作系統內核創建和撤銷。內核維護進程及線程的上下文信息以及線程切換。一個內核線程由於I/O操作而阻塞,不會影響其它線程的運行。

30.  用最快的算法寫出計算2*17的方法

答案: 17<<1 (移位操作)

31.  有n個人圍成一圈,從第一個人開始報數,報到m的時候把這個人剔出,從下一個繼續報數,報到下一個m的時候剔出該人,如此循環,直到所有人都被剔出.用java寫一個程序,輸出剔出的人的序號.這n個人的序號是1,2,3,…n..

這是我寫的,測試通過,僅供參考.

import java.util.Scanner;

publicclass NandM {

publicstaticvoid main(String args[]){

        Scanner s=new Scanner(System.in);

        int n=s.nextInt();

        int m=s.nextInt();

        int i=0,j=0,k=0,result=0;

        int a[]=newint[n];

        for(i=0;i<n;i++)

               a[i]=0;

        i=0;

        while(true){

               if(a[i]==0)

                      j++;

               if(j==m){

                      System.out.println(i+1);

                      a[i]=1;

                      j=0;

                      result=0;

                      for(k=0;k<n;k++)

                             result+=a[k];

                      if(result==n)

                             break;

               }

               if(i==n-1)

                      i=0;

               else

                      i++;

        }

}

}

32.  final,finalize,finally的區別?

http://blog.csdn.net/lvinging/article/details/5651742

答:final主要用於說明該類不能派生新子類,或表示該變量在使用過程中不被改變,用於方法時表示該方法不能被重載。

Finalize爲對象方法,主要用於在對象清除出內存前做必要的清理工作。

Finally主要用於提示在異常處理結束時,必須處理的函數塊。

33.  簡述ArrayLists和LinkedList的區別?

34.  實現點擊頁面上的一個鏈接,然後隱藏這個鏈接的javascript代碼。

35.  C/S架構,B/S架構融合

36.  equals()方法:比較兩個對象的類型和值; ==:比較兩個對象的地址

37.  簡述template 和 Strategy設計模式的區別

   模板-------設計模式

適用條件:

1) 一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現。
2) 各子類中公共的行爲應被提取出來並集中到一個公共父類中以避免代碼重複。
3) 控制子類擴展。模板方法只在特定點調用操作,這樣就只允許在這些點進行擴展。如果你不願子類來修改你的模板方法定義的框架,你可以採用兩種方式來做:一是在API中不體現出你的模板方法;二、將你的模板方法置爲final就可以了。

解決方案:

1) AbstractClass(抽象類):定義了一到多個的抽象方法,以供具體的子類來實現它們;而且還要實現一個模板方法,來定義一個算法的骨架。該模板方法不僅調用前面的抽象方法,也可以調用其他的操作,只要能完成自身的使命。
2) ConcreteClass(具體類):實現父類中的抽象方法以完成算法中與特定子類相關的步驟。
實例:

public abstract class Bank {
private double lilu;      // 利率
private double fond;   // 本金
public double getFond() {
   return fond;
}
public void setFond(double fond) {
   this.fond = fond;
}
public double getLixi(){    //抽象類中的模板方法其中調用了一個抽象方法
   return getFond()*getLilu();
}
public abstract double getLilu(); //抽象類中的抽象方法

}

public abstract class m_ChinaBank extends Bank { 

//另一個抽象類.繼承了上一個抽象類
private double time ;     //時間
public double getLixi(){                  //override基類中的模板方法
   return getFond()*getLilu()*getTime();
}
public double getTime() {
   return time;
}
public void setTime(double time) {
   this.time = time;
}
}

public class ChinaBank extends m_ChinaBank {

public static void main(String[] args){
   ChinaBank bk = new ChinaBank();
   bk.setFond(1000000);
   bk.setTime(100);
   System.out.println(bk.getLixi());
}
public double getLilu() {          //實現抽象類中的抽象方法.
   return 0.0003;
}
}

注意本例中模板設計模式只有三個類就可以完全表現出模板設計模式.爲什麼還要加上中間的一個類呢.主要是爲了演示怎樣在程序完成之後根據客戶的需求來升級程序之用.在中間類中我們重寫了getLixi()方法.改變了利率的計算方式.

12.說說你對測試驅動開發(TDD)的理解.

(1)測試驅動開發(Test-Driven Development):是敏捷開發中的一項核心實踐和技術,也是一種設計方法論。是極限編程的一個重要組成部分,它的基本思想就是在開發功能代碼之前,先編寫測試代碼。

(2)TDD的原理:在開發功能代碼之前,先編寫單元測試用例代碼,測試代碼確定需要編寫什麼產品代理。

(3)TDD基本思路:通過測試來推動整個開發的進行,但測試驅動開發並不只是單純的測試工作,而是把 需求分析,設計,質量控制量化的過程。

(4)TDD的重要目的:不僅僅是測試軟件,測試工作保證代碼質量僅僅是其中一部分,而且是在開發過程中幫助客戶和程序員出去模棱兩可的需求。TDD首先考慮使用需求(對象、功能、過程、接口等),主要是變成測試用例框架對功能的過程和接口進行設計,而測試框架可以持續驗證。

 

13 線程間通知和喚醒

http://www.cnblogs.com/duanjie/archive/2012/04/26/2489175.html

14 線程安全

(a)    如果要求線程安全,使用Vector、Hashtable;  enum,stack

(b)   如果不要求線程安全,應使用ArrayList,LinkedList,HashMap;

(c)    如果要求鍵值對,則使用HashMap,Hashtable;

(d)   如果數據量很大,又要線程安全,則考慮Vector。

15    Ioc和aop

ioc就是控制翻轉或是依賴注入。通俗的講就是如果在什麼地方需要一個對象,你自己不用去通過new 生成你需要的對象,而是通過spring的bean工廠爲你長生這樣一個對象。

aop就是面向切面的編程。比如說你每做一次對數據庫操作,都要生成一句日誌。如果,你對數據庫的操作有很多類,那你每一類中都要寫關於日誌的方法。但是如果你用aop,那麼你可以寫一個方法,在這個方法中有關於數據庫操作的方法,每一次調用這個方法的時候,就加上生成日誌的操作。

16 Comparator和Comparable的區別 

一個類實現了Camparable接口則表明這個類的對象之間是可以相互比較的,這個類對象組成的集合就可以直接使用sort方法排序。 
Comparator可以看成一種算法的實現,將算法和數據分離,Comparator也可以在下面兩種環境下使用: 
1、類的設計師沒有考慮到比較問題而沒有實現Comparable,可以通過Comparator來實現排序而不必改變對象本身 
2、可以使用多種排序標準,比如升序、降序等 

 

17  HTTPSession失效轉移

http://hi.baidu.com/spstreetpoet/item/366f5fcad82e68105050588a

 

 

18  jdbc事務隔離級別

 

 

知識點:

(1)java中sleep執行完之後,線程進入什麼狀態,就緒還是準備狀態,另外問一下yield()執行完呢?還有join呢?

sleep執行完後,線程進入睡眠狀態,只有當睡眠時間到達(sleep interval expires)或者被打擾(interrupted)才進入就緒狀態(ready);線程調用yield()執行完後使相同優先級的線程都獲得運行的機會。yield方法只用於非分時的系統中;線程調用join()方法後,等待該線程的終止。形參列表中可以設定終止需要的時間。

(2)JDBC的主要作用?

JDBC是由一系列連接(Connection)、SQL語句(Statement)和結果集(ResultSet)構成的,其主要作用概括起來有如下3個方面:
建立與數據庫的連接。
向數據庫發起查詢請求。
處理數據庫返回結果。

 Connection con = DriverManager.getConnection("jdbc:odbc:wombat","login",  "password"); 
  Statement stmt = con.createStatement(); 
  ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); 
  while (rs.next()) { 
  int x = rs.getInt("a"); 
  String s = rs.getString("b"); 
  float f = rs.getFloat("c"); 
  }

(3) springMVC中的中心控制Servlet是那個類?

簡介:spring內建了一個請求驅動的web mvc框架,以一個servlet分發器爲中心,將web請求分發到各個不同的處理器進行處理(這點和struts很相似)。這個servlet就是spring提供的DispatcherServlet,它必須在web.xml裏配置。當然web.xml裏可以配置多個DispatcherServlet,每個DispatcherServlet都會加載和自己相關的web應用上下文(即和應用相關的xml文件)。

例如:
<servlet>
     <servlet-name>jpet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           <load-on-startup>2<load-on-startup>
<servlet-mapping>
     <servlet-name>jpet</servlet-name>
     <url-pattern>*.do</url-pattern>
</servlet-mapping>
</servlet>
以上的配置表示所有“.do”結尾的請求都交DispatcherServlet來預處理(分發)。在web-inf下,spring默認查找jpet-servlet.xml作爲程序應用上下文。

 

(4)redirect不會默認產生301 Permanently moved的HTTP響應。

301 Moved Permanently 
客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。 301重定向是指當用戶或搜索引擎向網站服務器發出瀏覽請求時,服務器返回的HTTP數據流中頭信息(header)中的狀態碼的一種,表示本網頁永久性轉移到另一個地址。
301重定向可促進搜索引擎優化效果,從搜索引擎優化角度來看,301重定向是網址重定向最爲可行的一種辦法。當網站的域名發生變更後,搜索引擎只對新網址進行索引,同時又會把舊地址下原有的外部鏈接如數轉移到新地址下,從而不會讓網站的排名因爲網址變更而受到影響。同樣,在使用301永久性重定向命令讓多個域名指向網站主域時,亦不會對網站的排名產生任何負面影響。

 

(5)文件句柄可用變量

http://bdxnote.blog.163.com/blog/static/8444235200836252655/

對於open、close、print 、printf、write、select、eof等文件操作函數,都可以使用簡單的標量變量來替換這些函數的文件句柄參數,這時,簡單的標量變量中所存儲的數據必須是字符串類型,這些字符串就被看作文件句柄名稱;需要指出的是,open、close、write、select和eof等文件操作函數還允許使用表達式來替代文件句柄,但是表達式的值必須是字符串,被用做文件句柄名稱;有了這樣的特性,我們就可以通過隨意地構造字符串來動態地構造文件句柄名稱,以達到操作不用文件的目的;使用簡單變量替換文件句柄參數的語法如下:

$FileHandle  =  "INFILE";

$OpenFlag  =  open($FileHandle,"FileName1");

$FileHandle  =  "OUTFILE";

$OpenFlag  =  open($FileHandle,"FileName2");

在這些語句中,簡單變量$FileHandle的值是可以隨意變化的,這樣簡單變量$FileHandle每取一個不同的字符串,就可以打開一個與這個字符串所對應的文件,並生成一個對應的文件句柄;但是必須注意:這些簡單變量或者表達式的值必須是字符串,以用做文件句柄名稱;

 

(6) hashtable和trie

哈希表最快

二叉樹 trie都是 O(log(n))

鏈表 On)肯定不行

數據大小說明了  n>1024  ==>  log(n) > 10

如果不限制內存開銷,哈希表可以做到衝突非常少,一次就能檢索到

(7)飛機加油環球  http://www.toyear.info/?p=161#more-161

(8)稱石頭

挑出兩顆,把剩下6顆分成兩份稱重:

1、一樣重,則再稱一下挑出的那兩顆即可

2、不一樣重,排除較輕的三顆,剩下3顆挑一顆出來,稱其餘兩顆。如果一樣重,則挑出的那顆便是,如果不一樣重,重的那顆便是。

 

 

(9)tar(tapearchive)

功能說明:備份文件。

語    法:tar[-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b<區塊數目>][-C<目的目錄>][-f<備份文件>][-F<Script文件>][-K<文件>][-L<媒體容量>][-N<日期時間>][-T<範本文件>][-V<卷冊名稱>][-X<範本文件>][-<設備編號><存儲密度>][--after-date=<日期時間>][--atime-preserve][--backuup=<備份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<範本樣式>][--force-local][--group=<羣組名稱>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用戶名稱>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<區塊數目>][--recursive-unlink][--remove-files][--rsh-command=<執行指令>][--same-owner][--suffix=<備份字尾字符串>][--totals][--use-compress-program=<執行指令>][--version][--volno-file=<編號文件>][文件或目錄...]

-x或--extract或—get   從備份文件中還原文件。

-v或—verbose  顯示指令執行過程。

-z或--gzip或—ungzip  通過gzip指令處理備份文件。

-f<備份文件>或--   file=<備份文件>  指定備份文件。

-C<目的目錄>--directory=<目的目錄>切換到指定的目錄。

 

 

(10)軟件測試對象

根據軟件定義,軟件包括程序、數據和文檔,所以軟件測試並不僅僅是程序測試。軟件測試應貫穿於整個軟件生命週期中。在整個軟件生命週期中,各階段有不同的測試對象,形成了不同開發階段的不同類型的測試。需求分析、概要設計、詳細設計以及程序編碼等各階段所得到的文檔,包括需求規格說明、概要設計規格說明、詳細設計規格說明以及源程序,都應成爲“軟件測試”的對象。

在軟件編碼結束後,對編寫的每一個程序模塊進行測試,稱爲“模塊測試”或“單元測試”;在模塊集成後,對集成在一起的模塊組件,有時也可稱爲“部件”,進行測試,稱爲“集成測試”;在集成測試後,需要檢測與證實軟件是否滿足軟件需求說明書中規定的要求,這就稱爲“確認測試”。將整個程序模塊集成爲軟件系統,安裝在運行環境下,對硬件、網絡、操作系統及支撐平臺構成的整體系統進行測試,稱爲“系統測試”。

爲了把握各個環節的正確性,人們需要進行各種驗證和確認(verification & validation)工作。

驗證(verification)是保證軟件正確實現特定功能的一系列活動和過程,目的是保證軟件生命週期中的每一個階段的成果滿足上一個階段所設定的目標。

確認(validation)是保證軟件滿足用戶需求的一系列的活動和過程,目的是在軟件開發完成後保證軟件與用戶需求相符合。驗證與確認都屬於軟件測試,它包括對軟件分析、設計以及程序的驗證和確認。

 

(11)Servlet防止頁面被客戶端緩存

服務器端的HttpServlet可通過設置特定HTTP響應頭來禁止客戶端緩存網頁,以下示範代碼中的response變量引用HttpServletResponse對象:

response.addHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expires","0");

“Pragma”選項適用於採用HTTP 1.0的瀏覽器。HTTP 1.1中,“Cache-Control”選項用來決定客戶端是否可以緩存網頁,如果取值爲“no-cache”,那麼客戶端不會把Servlet生成的網頁保存在本地緩存中。HTTP 1.0和HTTP 1.1都支持“Expires”選項,因此所有的瀏覽器都能識別該選項。“Expires”選項用於設定網頁過期的時間,如果爲零,就表示立即過期。如果用戶重複請求訪問該網頁,那麼瀏覽器每次都應該從服務器端獲取最新的網頁數據。

 

(12)Class OutOfMemoryError

java.lang.Object

  java.lang.Throwable

      java.lang.Error

          java.lang.VirtualMachineError

              java.lang.OutOfMemoryError

http://online.chinaitpower.com/api/jdk150/index.html  在線api

http://online.chinaitpower.com/api/j2ee131/index.html  Servlet

http://online.chinaitpower.com/

 

(13)JSP ——JSP引擎轉換爲Servlet(.java)——Java編譯爲.class文件——由Java虛擬機解釋執行

 

(14)jsp頁面輸出類型選擇(HTML或EXCEL)

一、如果JSP頁面輸出的格式爲HTML,則在JSP面頁中作如下配置即可: 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> 
二、如果JSP頁面輸出的格式爲EXCEL,則在JSP面頁中作如下配置即可: 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="application/vnd.ms-excel; charset=UTF-8"%> 
注:contentType="application/vnd.ms-excel; charset=UTF-8"中的vnd.ms-excel即設置爲EXCEL格式顯示

 

 

 

(15)開-閉原則:一個軟件實體應該對擴展開放,對修改關閉。

滿足開閉原則的模塊符合下面兩個標準:

對擴展開放 ------- 模塊的行爲可以被擴展從而滿足新的需求。

對修改關閉 ------- 不允許修改模塊的源代碼。(或者儘量使修改最小化)

(16)HttpServlet詳解

http://www.cnblogs.com/panjun-Donet/archive/2010/02/22/1671290.html

 

(17) synchronized和wait()、notify()的關係 

http://blog.163.com/sunflower123_happy/blog/static/17327442120112264383864/

(18)請說說XML中<xs:sequence><xs:choice>和<xs:all>之間的區別?

sequence中定義的元素,在XML中必須按組內定義的先後順序依次出現。

choice中定義的元素就如同枚舉一樣,定義的一組元素在XML中只能任意出現一個。

all定義的一組元素要出現就都出現,但先後順序任意,all中的元素最多隻能出現一次。

(19)領域模型

領域模型是對領域內的概念類或現實世界中對象的可視化表示。又稱概念模型、領域對象模型、分析對象模型。它專注於分析問題領域本身,發掘重要的業務領域概念,並建立業務領域概念之間的關係。

(20)Servlet的生命週期是什麼?

Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。

與cgi的區別在於servlet處於服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務於多個請求,並且其實例一般不會銷燬,而CGI對每個請求都產生新的進程,服務完成後就銷燬,所以效率上低於servlet。

(21)自動提交模式

最大限度減少事務開銷的第一個方法是通過把多個操作移到一個單一事務中來合併事務。默認情況下,JDBC連接工作在自動提交模式下,這就意味着每個發送到數據庫的操作都會作爲獨立事務自動執行。在這種情況下,每個Statement.execute()方法調用都如同由一條BEGIN TRANSACTION命令開始,並由一條COMMIT命令結束。

關閉自動提交模式並且明確定義事務需要進行大量額外的工作,因爲你必須手動添加事務劃分語句(COMMIT和ROLLBACK)。但是合併事務可以減少性能開銷,特別是當你對你的系統進行伸縮時。(下面的"批量更新"部分會涉及到合併更新事務的技術細節。)在重負荷系統中,事務開銷意義重大。開銷越低,系統的可伸縮性就越好。

簡單地使用Connection.setAutoCommit(false)命令來關閉自動提交模式。

JDBC API還提供了一個Connection.getAutoCommit()方法來返回當前的自動提交模式。當你關閉了自動提交模式,你將需要使用兩個事務劃分方法:Connection.commit()Connection.rollback()

當人工控制事務時,需要遵循以下幾條原則:使事務儘可能保持簡短,不要在一個事務中包含很多操作使它們變得非常冗長。(使事務打開並保持行開鎖狀態,會影響其他事務並降低可伸縮性。)然而,如果幾項操作可以一項接一項地執行,那麼就把它們合併到一個事務中。

合併操作可能需要在你的SQL語句中增加額外的條件邏輯,並且可能需要臨時表。不管這個開銷,合併事務會更加有效,因爲數據庫可以在一個步驟內獲得所有需要的鎖,並在一個步驟內釋放它們。

當自動提交模式沒有關閉時,它所引起的更多事務會產生更多的通信開銷,更多的鎖定和釋放時間,以及與其他會話發生衝突的更大可能性。

(22)crawler爬取

根據抓取過程蜘蛛主要分爲三個功能模塊,一個是網頁讀取模塊主要是用來讀取遠程Web服務器上的網頁內容,另一個是超鏈分析模塊,這個模塊主要是分析網頁中的超鏈接,將網頁上的所有超鏈接提取出來,放入到待抓取URL列表中,再一個模塊就是內容分析模塊,這個模塊主要是對網頁內容進行分析,將網頁中所有超標誌去掉只留下網頁文字內容。

 

(23) 服務器返回的各種HTTP狀態碼介紹

http://down.chinaz.com/server/201103/157_1.htm

100系列碼

從100到199範圍的HTTP狀態碼是信息報告碼。基於各種原因考慮,大多數情況下我們 是很少看見這些代碼的。首先,如果一個瀏覽器嘗試訪問一個網站,而網站返回這些代碼時,它們往往都不會顯示在屏幕上。它們只是瀏覽器使引用的內部碼。另 外,這些代碼不常見的另外一個原因是起初HTTP標準不允許使用這一範圍的狀態碼。就其本身而言,它們也一直沒有被廣泛地使用。

200系列碼

從200到299範圍的狀態碼是操作成功代碼。同樣的,在正常的Web上網中,你也很可能不曾在屏幕上看到這些代碼。相反的,這些代碼是在瀏覽器內部使用的,用以確認操作成功確認和當前請求狀態。雖然這些代碼通常不顯示,但是有一些故障排除工具能夠讀到它們,就像和其它大多數的HTTP狀態碼一樣,它們在錯誤診斷過程中是非常有用的。

300系列碼

從300到399範圍的狀態碼是重定向代碼。本質上,它們告訴Web瀏覽器必須執行其它一些操作以完成請求。基於這個命令的特點,它可以自動地執行,或者要求額外的用戶輸入。比如,狀態碼301表示一個特定資源已經被永久地先移除,因此將來所有訪問該資源請求都應該定向到一個特定的URL上。

400系列碼

在400範圍的狀態碼是客戶端錯誤碼。這種類型的錯誤碼往往跟安全相關。比如,如果一個客戶端嘗試訪問一個未授權訪問的資源,服務器就會返回一個狀態碼401。類似地,如果客戶端嘗試訪問一個禁止的資源,在這種情況下客戶端的認證狀態是一樣的,那麼服務器可能會返回一個狀態碼403,表示禁止對該資源進行訪問。

如果請求不正確或客戶端超時,400級錯誤碼也可能被返回。然而,有一個400級的代碼總是具有誤導性:404。雖然這個代碼在技術上被歸類爲客戶端錯誤,但是事實上它可以同時表示客戶端或服務器上的錯誤。但這個錯誤碼只是簡單地顯示爲沒有找到請求的資源。當這個錯誤發生在客戶端時,它往往表示的是網絡連接問題。在其他時候,這個錯誤的發生還可能是由於資源已從服務器上轉移或重命名而造成的。

500系列碼

500級狀態碼錶示的是服務器錯誤。比如,如果Web服務器超時,它就會產生一個504錯誤。雖然,一個500級的錯誤往往表示的不是服務器的問題,而是在服務器上運行的Web應用的問題。比如,我自己的個人網站是用ASP編寫的,它負責動態生成HTML網頁。在調試的過程中,有Bug的代碼總會導致我的Web服務器返回HTTP狀態碼500,該代碼是一般表示內部服務器錯誤。這個代碼只是出 現問題了,並且HTTP無法解決該問題。

 

(24)分佈式應用通信協議

http://neoremind.net/2012/05/%E5%88%86%E5%B8%83%E5%BC%8F%E5%BA%94%E7%94%A8%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE/

歷史

第一輪:HTTP,帶來了Internet與電子商務
第二輪:Java,cross-platform,最早的RMI
第三輪:XML,標準的數據封裝技術,各種App之間交換數據不再是難事。
第四輪:RPC,Webservice、REST、高性能通信協議

 

(25)static作用(修飾函數、局部變量、全局變量)

http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html

1. static全局變量與普通的全局變量有什麼區別 ?

  全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。

  全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。

  這兩者的區別在於非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。 

  static全局變量只初使化一次,防止在其他文件單元中被引用;   

2.  static局部變量和普通局部變量有什麼區別 ?

   把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的作用域,限制了它的使用範圍。  

  static局部變量只被初始化一次,下一次依據上一次結果值;   

3.  static函數與普通函數有什麼區別?

   static函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明爲內部函數(static修飾的函數),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件.

static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

 

(26)典型的針對系統漏洞的Dos攻擊有哪些? 

http://blog.163.com/freecool1987@126/blog/static/142733162201121584423666/

常見的DOS/DDOS攻擊可以分爲兩大類:一類是針對系統漏洞的的攻擊如Ping of Death、TearDrop等,另一類是帶寬佔用型攻擊比較典型的如UDP flood 、SYN flood、ICMP flood等。

DDoS的攻擊類型目前主要包括三種方式,即TCP-SYN Flood攻擊、UDP Flood攻擊以及提交腳本攻擊。

 

(27)項目的特性

http://yingyu.100xuexi.com/view/examdata/20100708/071C235A-4B35-4A02-8F0F-82AD570A7560.html

 

(28)請用最少的額外空間將一個M*N的矩陣旋轉90度,寫出算法描述和類c語言程序;

(29)完成如下函數,給定分子和分母,輸出其小數表示形式,循環節用[]表示,例如給出分子:13,分母19,輸出爲:0.[13]

#include "stdafx.h"

#include <iostream>

 

using namespace std;

 

int main()

{

const int M = 5;

const int N = 3;

 

int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

int* p = a[0];

 

//轉90度後的矩陣設爲b[N][M],則 b[i][j] = *(p + i + j*N)

for(int i = 0; i < N; i++)

{

for(int j =0; j < M; j++)

{

cout<< *(p + i + j*N) <<",";

}

 

cout<<endl;

}

 

system("pause");

 

return 0;

}

 

(30)已知一個整數數組a,給定一個整數x,判斷x是否數組a中某兩個數之和?

這是今年10月阿里巴巴在西安的筆試題,面試時也問到:

雖然很簡單,但優化算法不知如何寫:

 

我的算法是:

 

for(i=0;i <N;++i)

{

    for(j=i+1;j <N;++j)

    {

        if(x==a[i]+a[j])

            return 1;  //true

    }

}

return 0;    //false

 

在《算法導論》裏有一道這樣的習題,我的答案是:

1.首先對數組進行排序,用時O(nlgn);

2.對於數組中每個元素a,計算b=x-a,利用二分查找在數組裏查找是否存在等於b的元素,用時O(nlgn)。

總用時O(nlgn)。

 

1.linux內存分頁分段地址轉換.由什麼實現

2.linux 命令 tac

3.unix進程分爲 進程描述符、數據段、代碼段,區分數據段和代碼段的目的是?

4.跟淘寶的那道題一樣 逆波蘭表達式 中序--後序

本帖隱藏的內容

5.找到最近五天的數據並且刪除,考的很細 -mtime -exec 還有xarg

6.oooooooooold problem 1000瓶藥需要幾隻狗的問題,不過把狗狗換成小白鼠..

7. 字符串常用匹配算法的複雜度。-->算法導論第32章

8.linux中刪除 -- 文件

9.python的註釋用# ?

10. av樹建樹複雜度。

11.滿二叉樹vs完全二叉樹

12.二分查找棧實現需要的最小容量。

13.鏈表vs數組的優缺點



14.函數指針

15.結構體內存對齊

16. 引用

17.

18.list vector set map

19. 數組指針

20. templete<>問題

21.數組

22.case 缺了break時候的問題
23.類
24.queue可以用那些stl實現?
25.虛函數表在那個階段完成。
問答:
1.去銀行怎麼排在用時最短的隊裏?
2.實時搜索.

 

 

 

 

 

 

公共題也想寫寫,主要是由我最差的智力題。呵呵,其實智力題很多是需要細心的,諸如邏輯推理之類的題目就不去深究了,畢竟這個是積累啊!

看來,智力題中的數組序列、三個水桶問題最容易考了,好多的類似的題目,

諸如DOS攻擊系統漏洞就是純網絡的了:Synflood、Smurf、.Land-based、Ping of Death、Teardrop、PingSweep、Pingflood。

緩衝區溢出攻擊向緩衝區發送大量數據,使部分數據溢出到相鄰的內存緩衝區,從而破壞緩衝區或者重寫邏輯。這樣就能夠造成拒絕服務、破壞數據或者在遠程服務器上執行惡意代碼。防止緩衝區溢出攻擊的惟一方法是檢查所有用戶輸入的長度。至於輸入法漏洞的3389端更是每天聽說過快了,什麼玩意!

前兩條沒有寫完呢,繼續吧!公共題中有考到軟件測試方面的知識,涉及測試用例個數,這個需要鞏固軟件工程的知識了,個人覺得軟考軟件設計師的書重要的!其實無論是語句覆蓋還是條件覆蓋。

此外,還考到了oracle中admin下的幾個目錄:udump,用戶轉儲文件存放位置[存放用戶信息];bdump,後臺進程的一些調試、日誌信息[後臺進程和ALRET.LOG文件];cdump,主要是oracle的內核轉儲記錄存放位置[存放系統文件]。

有一個很好的軟件,TureCrypt,源磁盤加密軟件,免費軟件,加密方法不像普通的加密大師什麼的,一下子就能破解。WinwebMail、SendMail都是典型的郵件服務器,呵呵,這個不知道哦,可以自己假設這樣一個郵件服務器的!

至於使普通用戶可執行超級用戶文件的就是s權限了,unix-center是個學習unix的好網站哦!chmod +s,創建s與t權限,是爲了讓一般用戶在執行某些程序的時候,能夠暫時具有該程序擁有者的權限。當s權限在user的x時,也就是類似 -r-s--x--x,稱爲Set UID,簡稱爲SUID,這個UID表示User的ID,而User表示這個程序(/usr/bin/passwd)的擁有者(root)。那麼,我們就可以知道,當dmtsai用戶執行 /usr/bin/passwd時,它就會“暫時”得到文件擁有者root的權限。

軟件測試並不等於程序測試,軟件測試應該貫穿整個軟件定義與開發整個期間。因此需求分析、概要設計、詳細設計以及程序編碼等各階段所得到的文檔,包括需求規格說明、概要設計規格說明、詳細設計規格說明以及源程序,都應該是軟件測試的對象。

OPenAPI我覺得單元測試、安全測試和性能測試至少是要的吧,而驗收測試是部署軟件之前的最後一個測試操作,其目的是確保軟件準備就緒,並且可以讓最終用戶將其用於執行軟件的既定功能和任務。它主要是針對項目型的測試系統,α測試和β測試主要是針對產品型的測試系統,而不能說驗收測試包括α測試和β測試,驗收測試也是UAT-User Acceptance Testing即用戶可接收性測試,它是以用戶爲主的測試。

項目最重要的特性應該是可管理性和可預測性吧。

Web應用安全漏洞最突出的有:Cross Site Scripting、SQL injection等。Cross Site Scripting是一種存在於Web應用中,允許黑客向Web應用注入惡意腳本,以獲取其他用戶重要數據和隱私信息爲母的一種工具形式。

最後一題也得說一說了,有兩個有序的整數集合啊,b。請寫一個函數,實現找出a,b集合中的交集,並打印出來。這個題倒是不難,我想多了,硬是把第一個數組的值與第二個數組的值循環比較,算法時間複雜確實不敢恭維啊!實際上只需要從左到右比較就ok了。
附錄:
一、IPSec協議
      IPSec 協議不是一個單獨的協議,它給出了應用於IP層上網絡數據安全的一整套體系結構,包括網絡認證協議 Authentication Header(AH)、封裝安全載荷協議Encapsulating Security Payload(ESP)、密鑰管理協議Internet Key Exchange (IKE)和用於網絡認證及加密的一些算法等。IPSec 規定了如何在對等層之間選擇安全協議、確定安全算法和密鑰交換,向上提供了訪問控制、數據源認證、數據加密等網絡安全服務。
     IPSec協議是一個範圍廣泛、開放的VPN安全協議,工作在OSI模型中的第三層——網絡層。
     IPSec協議實際上是一套協議而不是一個單個的協議。
二、隧道技術(Tunneling)
      隧道技術的基本過程是在源局域網與公網的接口處將數據(可以是ISO 七層模型中的數據鏈路層或網絡層數據)作爲負載封裝在一種可以在公網上傳輸的數據格式中,在目的局域網與公網的接口處將數據解封裝,取出負載。被封裝的數據包在互聯網上傳遞時所經過的邏輯路徑被稱爲“隧道”。
  要使數據順利地被封裝、傳送及解封裝,通信協議是保證的核心。目前VPN隧道協議主要有4種:點到點隧道協議PPTP、第二層隧道協議L2TP、網絡層隧道協議IPSec以及SOCKS v5協議。其中,PPTP和L2TP工作在數據鏈路層,IPSec工作在網絡層,SOCK v5工作在會話層。各協議工作在不同層次,我們應該注意,不同的網絡環境適合不同的協議,在選擇VPN產品時,應該注意選擇。
三、SSL和HTTPS
     SSL協議位於TCP/IP協議與各種應用層協議之間,爲數據通訊提供安全支持。SSL協議可分爲兩層:SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,爲高層協議提供數據封裝、壓縮、加密等基本功能的支持;SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。SSL協議提供的服務主要有:認證用戶和服務器,確保數據發送到正確的客戶機和服務器;加密數據以防止數據中途被竊取;維護數據的完整性,確保數據在傳輸過程中不被改變。
      https是由Netscape開發並內置於其瀏覽器中,用於對數據進行壓縮和解壓操作,並返回網絡上傳送回的結果。HTTPS實際上應用了Netscape的完全套接字層(SSL)作爲HTTP應用層的子層。(HTTPS使用端口443,而不是象HTTP那樣使用端口80來和TCP/IP進行通信。)SSL使用40 位關鍵字作爲RC4流加密算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。。https是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,https的安全基礎是SSL。
四、GnuPG
       電子郵件和數據加密領域,PGP(Pretty Good Privacy)是最爲有名的加密工具之一。從9.0版開始,PGP已經發展成爲個人計算機數據保護的一個全面的解決方案。你也不一定非要花上大價錢才能保護郵件內容。GnuPG以實際行動證實了它是開源軟件中最好的解決方式之一。它能與絕大多數電子郵件客戶程序結合,爲其提供強大的加密技術。
      GnuPG進行加密要通過叫作公共密鑰基礎設施(PKI)的簡單原理。每個GnuPG用戶都擁有由一個公共密鑰和一個私有密鑰組成的密鑰對。使用公共密鑰進行加密的電子郵件只能用對應的私有密鑰解碼。公共密鑰及其對應的電子郵件地址集中儲存在GnuPG密鑰服務器上的數據庫中;私有密鑰只有它的主人才知道,且在每次使用時都必須輸入密碼。要想對一條信息進行加密必須從密鑰服務器上獲得接收人的公共密鑰。
五、linux中怎麼查找權限位爲S的文件
      兩種特殊的文件訪問權限分別是SUID(八進制爲4000)和SGID(八進制爲2000)。設置這兩種權限的文件,將使其它用戶在執行它們時擁有所有者的權限。也就是說,如果一個設置爲SUID的程序,即使是普通用戶使用也是作爲root來運行的。因此,SUID/SGID文件是安全的隱患。
      find / -type f -perm +6000 -ls | less
      find / -type f -perm +6000 > Suid-Sgid.txt
六、軟件缺陷生命週期
      軟件缺陷是指系統或系統部件中那些導致系統或部件不能實現其功能的缺陷。軟件缺陷的起源:需求、構架、設計、編碼、測試、用戶。對於每一個軟件缺陷都規定了6個生命狀態:Open、Working、Verify、Cancel、Close、Defer,它們的基本定義是:
        Open態---缺陷初試狀態,軟件測試員報告一個缺陷,缺陷生命週期開始;
        Working態---缺陷修改狀態,程序員接收缺陷,正在修改中;
        Verify態---缺陷驗證狀態,程序員修改完畢,等待軟件測試員驗證;
        Close態---缺陷關閉狀態,軟件測試員確認缺陷被改正,將缺陷關閉;
        Cancel態---缺陷刪除狀態,軟件測試員確認不是缺陷,將缺陷置爲刪除狀態 (不做物理刪除);
        Defer態---缺陷延期狀態,管理者確認缺陷需要延期修改或追蹤,將缺陷置爲延期狀態;
        上述Open態、Working態、Verify態,稱爲缺陷的活動態;
        Close態、Cancel態、Defer態,稱爲缺陷的終結態。
七、項目最重要的特性
        我提一點,根據客戶的水平採用不同的過程模型。  
     例如:  
    1、客戶如果有一定的項目經驗,對計算機比較瞭解,能給出比較明確的需求,可以採用瀑布模型。  
    2、客戶如果對計算機不是太瞭解,但有過類似項目的經驗,並且能積極的給出需求。需求基本正確,可以採用演化式原型開發方法。  
    3、如果客戶對計算機能爲他做什麼沒有概念的話。這時就比較適合用廢棄式原形開發方法。  
    4、如果客戶的主要需求基本穩定,但需求的增長速度和變動頻率都比較高,這時就應該用螺旋模型做開發過程模型。

九、兩個有序數組求交集的C++實現
#include <stdio.h>
#include <memory.h>
const int M = 5;
const int N = 6;
void intersect(int a[], int b[]) {
     if ((a[M - 1] < b[0]) || (a[0] > b[N - 1]))
        return;
     int n = M > N ? M: N;
     int *p = new int[n];
     memset(p, 0, n);
     int i = 0;
     int j = 0;
     int k = 0;
    while (i < M && j < N) {
         if (a[i] < b[j])
              i++;
         else if (a[i] > b[j])
             j++;
         else {
            p[k] = a[i];
           while (a[++i] == p[k]);
           while (a[++j] == p[k]);
            k++;
        }
   }
   for (i = 0; i < k; i++)
       printf("%4d", p[i]);
   delete [] p;
}
void main() {
     int a[M] = {1, 2, 2, 5, 7};
     int b[N] = {2, 2, 2, 2, 2, 2};
     intersect(a, b); 

 http://blog.sina.com.cn/s/blog_627828e50100fgf8.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章