1. 程式人生 > >三七互娛筆試 JAVA服務端程式

三七互娛筆試 JAVA服務端程式

博主前天做了三七互娛的web後端工程師方向的筆試,下面的連結為筆試後的總結:
https://blog.csdn.net/applying/article/details/80587129
然後第二天就被通知參加今晚的java服務端程式的筆試,目測第一個筆試是跪了,所以才被通知寫第二個,em,還是太菜了
Java伺服器程式的筆試,與web後端工程師方向的筆試都是一小時,題量都不多,java的只有21個題,14個單選,以及7個不定項選擇,沒有程式設計,內容涵蓋java的各個方法,繼承、多型、多執行緒、集合類、裝箱,以及像資料結構,概率,作業系統的死鎖判斷等。總結其中的幾個問題:
1.判斷一個數為2的n次方

  • 有刷過演算法題的朋友都知道,如果一個數為2的 n 次方,它的二進位制表示中,只有一個數位為1,所以將問題轉換為是否一個數的二進位制只有一個1
  • 而判斷方法很簡單,利用 n & (n - 1),如果 n 的二進位制只有一位1,則(n - 1)與 n 的二進位制表達中沒有一位是相同的,兩者&運算的結果為0

2.求複雜度,有4個選項,n,n 的 n 次方,2 的 n 次方

public int Fibonacci(int n) {   
    if (n <= 0) {
        return 0;
    }
    if (n == 1) {
        return
1; } return f(n - 1) + f(n - 2) }

這是斐波那契數列的遞迴解法,是最容易想到,也最容易書寫,但是複雜度很大的一種解法,網上有其他解釋複雜度的部落格,我就不多做重複,最終的結果是:
1.5^n <= f(n+1) <= 2^n, n>=1
一個指數級的複雜度,因此我們應該避免這種解法。
這裡補充一下另外兩種做法

  • 利用迴圈:簡單好理解,直接貼出程式碼,複雜度降為O(n)
int f(int n) {
    if (n <= 1) {
         return 1;
    }
    int
number0 = 0, number1 = 1, temp = 0; for (int i = 2; i <= n; i++) { temp = number0 + number1; number0 = number1; number1 = temp; } return number1; }

3.考察了平衡二叉樹和紅黑樹區別
4.考察了jvm的自動裝箱
5.作業系統中的,死鎖的必要條件

  • 互斥條件:每個資源要麼已經分配給了一個程序,要麼就是可用的
  • 佔有和等待條件:已經得到某個資源的程序可以再請求新的資源
  • 不可搶佔條件:已經分配給一個程序的資源不能被強制性地搶佔,它只能被佔有它的程序顯示地釋放
  • 環路等待條件:死鎖發生時,系統中一定有由兩個或兩個以上的程序組成一個環路,該環路中每個程序都在等待下一個程序所佔有的資源

6.考察了集合類的區別

  • 主要考察底層的實現是連結串列還是陣列的問題

7.執行緒安全

  • 常見的執行緒安全集合的記憶方法:喂,SHE(vector、stack、hashtable、Enumeration)
    -StringBuffer 執行緒安全 StringBuilder 執行緒不安全