下面記錄了一些,我覺得自己沒答好或者沒有寫出來的題,並在后面寫了一下思路。筆試時間2018-06-26
1.10000!后有幾個0?
思路:5的倍數和2的倍數相乘會產生0,而2的倍數是多於5的倍數的,因此算出有多少個5的倍數即可。10000/5=2000,10000/5^2=400,10000/5^3=80,10000/5^4=16,[10000/5^5]=3。總和為2499個0
2.a的ASCII碼97,A是65.
3.TCP如何保證可靠性?、
TCP通過校驗和、序列號、確認應答、重發控制、連接管理以及窗口控制等機制實現可靠性傳輸。
(1) 超時重傳。TCP發出一個段后,它啟動一個定時器,等待目的端確認收到這個報文段,如果不能及時收到一個確認,將重發這個報文段。
(2)校驗和。TCP將保證首部和數據的校驗和,這是一個端到端的校驗和,目的是檢測數據在傳輸過程中的任何變化。如果校驗和出錯,將丟棄該報文,且不做響應,等待超時重傳。
(3)TCP收到另一端的數據,它會發送一個確認。這個確認不是立即發送,而是推遲很小的時間,可能是對包做校驗。
(4)通過序列號保證數據以正確的順序交給應用層
(5)能夠丟棄重復數據。
(6)TCP是面向有連接,在交換數據前必須先建立連接,從而保證對端存在
(7)TCP提供了流量控制。TCP連接的每一方都有固定大小的緩沖區,為了防止較快主機致使較慢主機的緩沖區溢出,可以采用滑動窗口的方式來避免這種現象產生。
4.for(;;)和while(true)有哪些不同?
(1)編譯后的字節碼不同

(2)for的指令少,並且不會占用寄存器;此外,不需要每次都進行判斷。
(3)雖然兩者語義相同,由於for的底層更加簡潔,通常源碼中都采用這種方式“死循環”
5.算法題:三階方陣,如何保證每行之和、每列之和以及對角線之和都相等。
思路:這個題對於任意的奇數階方陣都有相同的方法來求解。

代碼如下:

package offer0627; /** * @author ChenXu * 題目:給定任意n奇數階方陣以及1~n*n,如何將數字放入其中保證各行各列以及對角線之和相等 * 思路: * (1)從1~n*n一順填,首先將1放在第一行的中間,然后下一個數字2放在上一個數字的右上方 * (2)如果出界了,也就是想象上下是連接在一起的,左右也是連接在一起的 * (3)如果所屬的位置已有元素,則放在上一個數的下面 * */ public class MagicSquare { private static int[][] fillMagicSquare(int n) { int a=n*n; int A[][]=new int[n][n]; //使用i,j完成當前點的判斷 //使用c,d記錄上一個點的坐標 int c=0,d=n/2; int i=c,j=d; for(int b=1;b<=n*n;b++) { A[c][d]=b; //取右上,只有可能i,j同時出界,或分別出界 i--;j++; //i,j同時出界 if(i<0 && j==n) { i=n-1; j=0; } //分別出界 if(i<0) i=n-1; if(j==n) j=0; //如果已有元素,則放在之前數字的下方 if(A[i][j]!=0) { i=(c+1)%n; j=d; } c=i;d=j; } return A; } private static void printSquare(int[][] A) { for(int i=0;i<A.length;i++) { for(int j=0;j<A[0].length;j++) { System.out.print(A[i][j]+" "); } System.out.println(""); } } public static void main(String[] args) { int n=4; if(n%2!=0) { int A[][]=fillMagicSquare(n); printSquare(A); }else { System.out.println("偶數次方陣,需要使用其他方式"); } } }
6.秒殺活動考慮的因素
記得之前有看過淘寶專家許令波寫的一篇文章《淘寶大秒系統設計詳解》:
https://blog.csdn.net/heyc861221/article/details/80122167
主要是對系統架構提出了一些優化的通用原則,主要包括:
- 熱點隔離(多個層次的隔離,以及提前識別的熱點數據和實熱點發現)
- 動靜分離(web系統的靜態化改造,緩存和CDN,基於時間分片峰值,Localcache)
- 數據分層校驗(漏斗式設計過濾掉無效的請求,對讀不做強一致性校驗,對寫做強一致性校驗,限流和保護)
作者的水平比較高,我只讀懂了部分,建議讀他的原文,觀摩大神~
網上還有一些,可以參考看看:
7.線程和進程分別是什么,以及區別?
(1)定義:
- 進程指的是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
- 線程:是進程的一個實體,是操作系統調度的最小單元。線程自己基本不擁有系統資源,只擁有一點運行時必不可少的資源(如程序計數器、寄存器和棧),但是它可以和同屬一個進程的其他線程共享進程所擁有的全部資源。
(2)區別:
- 一個線程只能屬於一個進程,但是一個進程可以擁有多個線程
- 線程是一種輕量級進程,與進程相比,線程的創建,維護和管理帶來的負擔小於進程,因此線程的代價或開銷比較小
- 線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制
- 進程在執行過程中擁有獨立的內存單元,而多個線程則是共享內存
- 對於通信來說,進程需要建立通信鏈路來通信,而線程間通信則通過讀取和寫入共享變量到主內存來完成通信
8.instanceof的用法
用來指出對象是否是特定類或接口的一個實例,有三種情況會返回true:
(1)對象是該類的實例(2)對象是該類子類的實例(3)對象是繼承該接口類的實例

package offer0627; interface People { void eat(); } class Person implements People{ public void eat() {} } class XiaoMing extends Person{ } public class testInstance{ public static void main(String[] args) { Person p=new Person(); XiaoMing xm=new XiaoMing(); System.out.println(p instanceof People); System.out.println(p instanceof XiaoMing); System.out.println(xm instanceof People); System.out.println(xm instanceof Person); } }