2020/4/6java面試刷題

每日練習

算法

對同一待排序序列分別進行折半插入排序和直接插入排序,兩者之間可能的不同之處是 ()。

正確答案: D 你的答案: D (正確)
A. 排序的總趟數
B. 元素的移動次數
C. 使用輔助空間的數量
D. 元素之間的比較次數

解析: 折半插入排序,是對插入排序算法的一種改進,由於排序算法過程中,就是不斷的依次將元素插入前面已排好序的序列中。由於前半部分爲已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查找的方法來加快尋找插入點的速度。 所以,很明顯比較的次數減少了。

在下列排序算法中,哪一個算法的時間複雜度與初始排序無關( )。
正確答案: D 你的答案: B (錯誤)
A. 直接插入排序
B. 氣泡排序
C. 快速排序
D. 直接選擇排序

堆歸選基與初始序列無關 快選希堆排序不穩定

直接選擇排序的時間複雜度最好最壞都是O(n^2)

下列各排序法中,最壞情況下的時間複雜度最低的是( )

正確答案: C 你的答案: C (正確)
A. 希爾排序
B. 快速排序
C. 堆排序
D. 冒泡排序

堆排序最好最壞情況時間下的時間複雜度都爲 O(nlog2n)

class program{
     static void Main(string[] args)
     {
         int i;
         i = x(x(8));
     }
     static int x(int n)
     {
         if (n <= 3)
             return 1;
         else
             return x(n - 2) + x(n - 4) + 1;
     }
 }

遞歸算法 x(x(8)) 需要調用幾次函數x(int n)

正確答案: C 你的答案: B (錯誤)
9
12
18
24

x(8)調用過程:

x(8) = x(6)+ x(4) +1 = 9
x(6) = x(4)+ x(2) +1 = 5
x(4) = x(2)+ x(0) +1 = 3

結果:調用9次,結果爲9

x(9調用過程):

x(9) = x(7)+ x(5) +1 = 9
x(7) = x(5)+ x(3) +1 = 5
x(5) = x(3)+ x(1) +1 = 3

總共調用18次,結果爲9

關於快速排序算法的說法中,哪幾個是正確的:()
正確答案: B C 你的答案: B C (正確)
A. 時間複雜度最壞是(nlogn)
B. 時間複雜度均攤是(nlogn)
C. 排序是不穩定的

判斷正誤

快速排序總比簡單排序快。

正確答案: B 你的答案: B (正確)

×

在所需要排序的序列基本有序的時候,快速排序的時間複雜度退化到O(n^2)

在這裏插入圖片描述

計算機基礎

採用自上而下分析,必須 _____ 。

正確答案: C 你的答案: C (正確)
A. 消除左遞歸
B. 消除右遞歸
C. 消除回溯
D. 提取公共左因子

帶回溯的自上而下分析實際上採用了一種窮盡一切可能的試探法,效率很低,代價極高。因此我們需避免帶回溯的自上而下分析。

()是負責對物聯網收集到的信息進行處理、管理、決策的後臺計算處理平臺。

正確答案: C 你的答案: A (錯誤)
A. 感知層
B. 網絡層
C. 雲計算平臺
D. 物理層

2003 年聯合國維和部隊進入伊拉克時,運用到了下列哪項技術,對伊拉克的空氣、水和土壤進行連續監測,來確定其是否有違反國際公約的核武器和生化武器?( )

正確答案: A 你的答案: C (錯誤)
A. 無線傳感網絡技術
B. 指紋識別技術
C. 射頻識別技術
D. 光纖傳感技術

WPS 中設置第二個窗口操作應按 ( )

正確答案: C 你的答案: B (錯誤)
A. ^KS
B. Ctrl+2
C. F6
D. F7

操作系統

執行指令find / -name “test.c”,按ctrl+z後的提示有[1] 166,可以繼續執行的方式有()
正確答案: C 你的答案: A (錯誤)
A. kill 166
B. Ctrl+h
C. fg 1
D. bg 1

ctrl z 就是掛起一個進程,暫停的意思
fg是將進程放到前臺並喚醒
bg是將進程放到後臺並喚醒
ctrl+h,在shell就是向左刪除的作用

就文件的共享方式來說,()會在文件主刪除其共享文件後留下懸空指針的問題。

正確答案: B 你的答案: E (錯誤)
連訪法
A. 基於索引節點的共享方式
B. 繞彎路法
C. 基於文件目求法
D. 基於符號鏈的文件共享方式

基於索引結點的共享方式,即硬鏈接。 如當用戶A創建一個新文件時,它便是該文件的所有者,此時將count置爲1。當有用戶 B要共享此文件時,在用戶B的目錄中增加一個目錄項,並設置一指針指向該文件的索引結點。此時,文件主仍然是用戶A,count=2。如果用戶A不再需要此文件,不能將文件直接刪除。若直接刪除了該文件,也必然刪除了該文件的索引結點,這樣便會使用戶B的指針懸空。

引起一個進程進入掛起狀態的原因有多種,但一般不包括( )
正確答案: C 你的答案: A (錯誤)
A. 終端用戶請求
B. 父進程的請求
C. 請求訪問外部設備
D. 操作系統的需要

引起掛起狀態的原因有如下幾方面:
(1)終端用戶的請求。當終端用戶在自己的程序運行期間發現有可疑問題時,希望暫停使自己的程序靜止下來。亦即,使正在執行的進程暫停執行;若此時用戶進程正處於就緒狀態而未執行,則該進程暫不接受調度,以便用戶研究其執行情況或對程序進行修改。我們把這種靜止狀態成爲“掛起狀態”。

(2)父進程的請求。有時父進程希望掛起自己的某個子進程,以便考察和修改子進程,或者協調各子進程間的活動。

(3)負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能正常運行。

(4)操作系統的需要。操作系統有時希望掛起某些進程,以便檢查運行中的資源使用情況或進行記賬。

計算機網絡

計算機內的傳輸是 ()傳輸,而通信線路上的傳輸是 傳輸。

正確答案: A 你的答案: B (錯誤)
A. 並行,串行
B. 串行,並行
C. 並行,並行
D. 串行,串行

在操作系統中是指,一組程序按獨立異步的速度執行,無論從微觀還是宏觀,程序都是一起執行的。對比地,併發是指:在同一個時間段內,兩個或多個程序執行,有時間上的重疊(宏觀上是同時,微觀上仍是順序執行)。
串行通信是指 使用一條數據線,將數據一位一位地依次傳輸,每一位數據佔據一個固定的時間長度。

具有5個10M端口的集線器的總帶寬可以達到()
正確答案: B 你的答案: A (錯誤)
A. 50M
B. 10M
C. 2M
D. 100 M

集線器不管有多少個端口,所有端口都共享一條帶寬,在同一時刻只能有兩個端口傳送數據,其他端口只能等待;只能工作在半雙工模式下。

交換機每個端口都有一條獨佔的帶寬,當兩個端口工作時並不影響其他端口的工作,交換機可以工作在半雙工模式下也可以工作在全雙工模式下。

以下關於ICMP報文的特點的描述中,錯誤的是( )。

正確答案: A 你的答案: B (錯誤)
A. ICMP作爲高層協議,它的報文要封裝成IP分組
B. ICMP不能糾正差錯,它只是報告差錯
C. ICMP報文分兩類:差錯報告報文和查詢報文
D. ICMP差錯報文分爲:目的站不可到達、源站抑制、超時、參數問題和改變路由

ICMP(Internet Control Message Protocol Internet控制報文協議 ):網絡層協議。
主要功能:
1)確認網絡是否正常工作,即確認IP包是否成功送達目標地址;
2)ICMP報文分兩類遇到異常時進行問題診斷。

下面對Host文件描述正確的是()
正確答案: C 你的答案: B (錯誤)
A. 這個文件是批處理文件,用來指定域名的訪問IP
B. 一個DNS域名解析服務器文件,用於解析域名對應的IP地址
C. 作用是網址域名與其對應的IP地址建立一個關聯"數據庫"
D. 當用戶輸入網址後,系統首先到DNS服務器中尋找對應的IP地址,如果不存在會到Host文件中確定最終訪問地址

Hosts是一個沒有擴展名的系統文件,windows下存在C:\Windows\System32\drivers\etc位置,linux下存在/etc位置,其作用就是將一些常用的網址域名與其對應的IP地址建立一個關聯“數據庫”,當用戶在瀏覽器中輸入一個需要登錄的網址時,系統會首先自動從Hosts文件中尋找對應的IP地址,一旦找到,系統會立即打開對應網頁,如果沒有找到,則系統再會將網址提交DNS域名解析服務器進行IP地址的解析。

RIP協議是基於( )
正確答案: A 你的答案: B C (錯誤)
A. UDP
B. TCP
C. ICMP
D. Raw IP

RIP協議是一種內部網關協議(IGP),是一種動態路由選擇協議,用於自治系統(AS)內的路由信息的傳遞。RIP協議基於距離矢量算法(DistanceVectorAlgorithms),使用“跳數”(即metric)來衡量到達目標地址的路由距離。
RIP協議採用距離向量算法,在實際使用中已經較少適用。在默認情況下,RIP使用一種非常簡單的度量制度:距離就是通往目的站點所需經過的鏈路數,取值爲1~15,數值16表示無窮大。RIP進程使用UDP的520端口來發送和接收RIP分組。RIP分組每隔30s以廣播的形式發送一次,爲了防止出現“廣播風暴”,其後續的的分組將做隨機延時後發送。在RIP中,如果一個路由在180s內未被刷,則相應的距離就被設定成無窮大,並從路由表中刪除該表項。RIP分組分爲兩種:請求分組和響應分組。

在這裏插入圖片描述
在這裏插入圖片描述

數據庫

以下不是RDBMS的是()
正確答案: D 你的答案: B (錯誤)
A. mysql
B. postgreSql
C. oracle
D. hadoop

RDBMS 是SQL 的基礎,同樣也是所有現代數據庫系統的基礎,比如MS SQL Server, IBM DB2, Oracle, MySQL 以及Microsoft Access。hadoop是分佈式數據庫

在E-R模型中,如果有3個不同的實體型,3個m:n聯繫,根據E-R模型轉換爲關係模型的規則,轉換後關係的數目爲 ( )。

正確答案: C 你的答案: C (正確)
A. 4
B. 5
C. 6
D. 7

1個M:N關係的例子。 例如有學生和老師兩個實體,一個學生可以由多名老師來授課,一名老師也可以授課多名學生,它們是M:N關係的,假如聯繫爲授課,該聯繫上有成績屬性,因此當我們把它轉換爲關係模型時,我們把聯繫轉換爲聯繫實體,並添加學生實體的主鍵(學號)和教師實體的主鍵(教師編號)作爲自己的主鍵,值得注意的是,授課實體的外鍵分別是學號和教師編號,但是它的主鍵是(學號,教師編號)

數據結構

下面算法中可以判斷出一個有向圖是否有環的是:()
正確答案: B D 你的答案: D (錯誤)
A. 求最短路徑
B. 深度優先遍歷
C. 廣度優先遍歷
D. 拓撲排序

編程 LeetCode

1.按序打印

我們提供了一個類:

public class Foo {
  public void one() { print("one"); }
  public void two() { print("two"); }
  public void three() { print("three"); }
}

三個不同的線程將會共用一個 Foo 實例。

線程 A 將會調用 one() 方法
線程 B 將會調用 two() 方法
線程 C 將會調用 three() 方法
請設計修改程序,以確保 two() 方法在 one() 方法之後被執行,three() 方法在 two() 方法之後被執行。

class Foo {

    public Foo() {
        
    }

    public void first(Runnable printFirst) throws InterruptedException {
        
        // printFirst.run() outputs "first". Do not change or remove this line.
        printFirst.run();
    }

    public void second(Runnable printSecond) throws InterruptedException {
        
        // printSecond.run() outputs "second". Do not change or remove this line.
        printSecond.run();
    }

    public void third(Runnable printThird) throws InterruptedException {
        
        // printThird.run() outputs "third". Do not change or remove this line.
        printThird.run();
    }
}

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/print-in-order

解題

簡單易懂的實現方式:volatile標誌變量實現

class Foo {

    public volatile int flag = 0;

    public Foo() {
        
    }
    public void first(Runnable printFirst) throws InterruptedException {
       
        // printFirst.run() outputs "first". Do not change or remove this line.
        printFirst.run();
         flag = 2;
    }
    public void second(Runnable printSecond) throws InterruptedException {
        while(flag != 2){
        }
        // printSecond.run() outputs "second". Do not change or remove this line.
        printSecond.run();
        flag = 3;
    }
    public void third(Runnable printThird) throws InterruptedException {
        while(flag != 3){
        }
        // printThird.run() outputs "third". Do not change or remove this line.
        printThird.run();
    }
}

AtomicInteger實現大同小異

CountDownLatch實現:

class Foo {
    public CountDownLatch latch2 = new CountDownLatch(1);
    public CountDownLatch latch3 = new CountDownLatch(1);
    public Foo() {
        
    }

    public void first(Runnable printFirst) throws InterruptedException {
        
        // printFirst.run() outputs "first". Do not change or remove this line.
        printFirst.run();
        latch2.countDown();
    }

    public void second(Runnable printSecond) throws InterruptedException {
        latch2.await();
        // printSecond.run() outputs "second". Do not change or remove this line.
        printSecond.run();
        latch3.countDown();
    }

    public void third(Runnable printThird) throws InterruptedException {
        latch3.await();
        // printThird.run() outputs "third". Do not change or remove this line.
        printThird.run();
    }
}

Semaphore實現 :用acquire() 、release()方法實現邏輯和這個差不多

實現方式 提交結果 執行用時 內存消耗 語言
Volatile 通過 15 ms 39.2 MB Java
AtomicInteger 通過 15 ms 39.4 MB Java

2.交替打印FooBar

我們提供一個類:

class FooBar {
  public void foo() {
    for (int i = 0; i < n; i++) {
      print("foo");
    }
  }

  public void bar() {
    for (int i = 0; i < n; i++) {
      print("bar");
    }
  }
}

兩個不同的線程將會共用一個 FooBar 實例。其中一個線程將會調用 foo() 方法,另一個線程將會調用 bar() 方法。

請設計修改程序,以確保 “foobar” 被輸出 n 次。

class FooBar {
    private int n;

    public FooBar(int n) {
        this.n = n;
    }

    public void foo(Runnable printFoo) throws InterruptedException {
        
        for (int i = 0; i < n; i++) {
            
        	// printFoo.run() outputs "foo". Do not change or remove this line.
        	printFoo.run();
        }
    }

    public void bar(Runnable printBar) throws InterruptedException {
        
        for (int i = 0; i < n; i++) {
            
            // printBar.run() outputs "bar". Do not change or remove this line.
        	printBar.run();
        }
    }
}

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/print-foobar-alternately

解題

核心是要實現foo()、bar()兩個線程的方法同步與互斥,使用lock加鎖實現兩個循環體代碼的互斥執行,打印foo之後condition.signal()通知另一個線程,另一個線程打印bar後condition.signal()通知剛纔的線程,flag主要是爲了確保第一次進來先執行foo():

class FooBar {
    private int n;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    private volatile boolean flag = false;

    public FooBar(int n) {
        this.n = n;
    }

    public void foo(Runnable printFoo) throws InterruptedException {
        
        for (int i = 0; i < n; i++) {
            lock.lock();
        	// printFoo.run() outputs "foo". Do not change or remove this line.
            if(flag) condition.await();
        	printFoo.run();
            flag = true;
            condition.signal();
            lock.unlock();
        }
    }

    public void bar(Runnable printBar) throws InterruptedException {
        
        for (int i = 0; i < n; i++) {
            lock.lock();
             if(!flag) condition.await();
            // printBar.run() outputs "bar". Do not change or remove this line.
        	printBar.run();
            condition.signal();
            lock.unlock();
        }
    }
}

更多方法:有時間了研究

注:本文選擇題來自牛客網,編程題來自LeetCode,做錯題和不會題記錄。

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