某碩軟件校園招聘筆試題(開發)
第一部分:簡答題
1.請問TCP/IP協議分為哪幾層?
按照一般套路他可能想問的是ISO七層模型(理論),然而另外有一個模型叫做TCP/IP模型的四層模型(實際),它們分別如下:
ISO七層模型:
TCP/IP四層模型:
2. 寫出判斷ABCD四個表達式的是否正確,若正確,寫出各個表達式中a的值。
int a=4;
(A) a+=(a++);
(B) a+=(++a);
(C) (a++)+=a;
(D) (++a)+=(a++);
首先明確一下基本法,左值必須是一個地址。
所以:
A:8
B:9
C、D錯誤。
我去這么基礎的我開始竟然沒做對....我以為自加的在使用完會改變自己值,現在看來是被丟棄了,自運算什么的一直有點暈暈的,無實用價值的東西不值得花費時間,價值觀如此,嘲諷請隨意
3. 給跪了,草榴算不 :)
4. Error和Exception有什么區別?
Exception是正常的,屬於程序員掌控范圍內,並且可以借助Exception的名字傳遞信息(異常重要的就是名字,詳見Thinking in java第十二章),但是一出現Error基本意味着玩砸了...
參考了一下網上的資料:
1. Exception是可控的,應該在程序級就處理掉,Error是不可控的,讓系統去處理。
2. 一般是由程序員(或輸入)導致的問題(人為因素),Error一般是系統錯誤或低級(沒太理解?)的錯誤(不可控因素)。
3. (Exception) chekced exception鼓勵catch,(RuntimeException & Error) unchecked exception不鼓勵catch。
參考資料:錯誤和異常的區別(Error vs Exception)
5. String、StringBuffer、StringBuilder的區別?
光看底層的話好像並沒有太大的區別,都是使用char[]數組來實現的,但是String有一個字符串緩沖池,之前被使用過的會緩存啊,並且像這種"hello"+"world"的會被預編譯為StringBuffer的拼接。
好了不扯淡,正經答題:
長度:String是不可變類型,再操作只能返回新的類型,而StringBuffer和StringBuilder的長度都是可變的。
線程安全:StringBuffer是線程安全的,StringBuilder是非線程安全的,當然套路中想聽的一句話就是線程安全的效率都會低一些....
通常StringBuffer或StringBuilder會被用來做多次字符串拼接的緩沖。
第二部分:程序題
1. 請編寫一個程序實現乘法口訣表,乘法口訣表如下:
送頭題,如下:
1 public class Main { 2 3 public static void main(String[] args) { 4 5 for(int i=1;i<=9;i++){ 6 for(int j=1;j<=i;j++){ 7 System.out.printf("%d*%d=%d ",i,j,i*j); 8 } 9 System.out.println(); 10 } 11 12 } 13 14 }
2. 畢達哥拉斯三元組(此處省略看不懂的英文名詞描述...),是一組三個正數,a<b<c,並且滿足a^2+b^2=c^2。例如:3^2+4^2=5^2,。現在存在一組上面那個名詞的數滿足a+b+c=1000,請編寫一個程序找到這組數a,b,c並將它們輸出。
繼續送頭,這組數是: 200 375 425
代碼如下:
1 public class Main { 2 3 public static void main(String[] args) { 4 5 final int n=1000; 6 for(int c=n;c>=0;c--){ 7 for(int b=c-1;b>=0;b--){ 8 int a=n-b-c; 9 if(a<0 || a>=b) continue; 10 if(pow2(a)+pow2(b)==pow2(c)){ 11 System.out.printf("%d %d %d\n",a,b,c); 12 } 13 } 14 } 15 } 16 17 public static int pow2(int n){ 18 return n*n; 19 } 20 21 }
3. 平面上有6個點,每兩個點之間都以紅線或黑線連接,任意三點均不共線。現在,已知下列點之間的連線是紅色的,剩下的連線都是黑色的,要求計算這些點組成的三角形有多少是同色的?
已知的紅色連線:
6 5 1 2 1 3 2 3 2 5 3 6
這道題考的是算法。
我的思路:
每兩個點之間都以紅線或黑線連接 --> 有條邊的全連通圖
任意三點不共線 --> 任意三個頂點都可以組合
根據以上兩條可以推出:取任意三個頂點都可以組合成一個三角形。
所有三角形的可能性是:
=20種
從這20種選出三條邊a-b、b-c、c-a都相等的邊。
可以構圖了,使用鄰接矩陣:
代入樣例數據:
代碼如下:
1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 final int size=6; 8 final int inf=-1; 9 10 int x[][]=new int[size][size]; 11 for(int i=0;i<size;i++){ 12 x[i][i]=inf; 13 } 14 15 Scanner sc=new Scanner(System.in); 16 int n=sc.nextInt(); 17 while(n-->0){ 18 int u=sc.nextInt()-1; 19 int v=sc.nextInt()-1; 20 x[u][v]=1; 21 x[v][u]=1; 22 } 23 24 int ans=0; 25 for(int i=0;i<size;i++){ 26 for(int j=i+1;j<size;j++){ 27 for(int k=j+1;k<size;k++){ 28 if(x[i][j]==x[j][k] && x[j][k]==x[k][i]) ans++; 29 } 30 } 31 } 32 System.out.println(ans); 33 34 } 35 36 }
輸入:
6 6 5 1 2 1 3 2 3 2 5 3 6
輸出:
5
4. 存在一個Words.txt,這是一個保存了5000多單詞的文本文件,將里面的單詞按其字母在26字母表里的位置獲取一個位置數(A為1,Z為26),再將每個字母的位置相加,即得到這個單詞的得分。
例如:COLIN,它的字母值是3+15+12+9+14=53,所以該單詞得分53,請寫程序計算出這個文件里得分最高的單詞。
備注:名字間是用逗號分隔的,得分不區分字母大小寫。
這道題考的是工程應用。
計算得分的類:
1 import java.io.BufferedReader; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.UnsupportedEncodingException; 7 8 /** 9 * 單詞工具類 10 * @author CC11001100 11 * 12 */ 13 public class WordUtils { 14 15 /** 16 * 傳入文件路徑和文件編碼方式,返回得分最高的單詞 17 * @param filepath 文件路徑 18 * @param separator 單詞分隔符 19 * @param charset 文件編碼方式 20 * @return String 得分最高的單詞 21 */ 22 public static String getHighestScore(String filepath,String separator,String charset){ 23 24 BufferedReader reader=null; 25 try { 26 reader=new BufferedReader(new InputStreamReader(new FileInputStream(filepath),charset)); 27 28 //緩沖讀入 29 StringBuilder sb=new StringBuilder(); 30 while(reader.ready()) sb.append(reader.readLine()); 31 32 //分離單詞 33 String ss[]=sb.toString().split(separator); 34 35 //計算每個單詞得分拿到最大的 36 int maxScore=0; 37 String maxString=null; 38 for(int i=0;i<ss.length;i++){ 39 int t=coutingScore(ss[i]); 40 if(t>maxScore){ 41 maxScore=t; 42 maxString=ss[i]; 43 } 44 } 45 46 return maxString; 47 } catch (UnsupportedEncodingException e) { 48 e.printStackTrace(); 49 } catch (FileNotFoundException e) { 50 e.printStackTrace(); 51 } catch (IOException e) { 52 e.printStackTrace(); 53 }finally{ 54 //清理資源 55 if(reader!=null){ 56 try { 57 reader.close(); 58 } catch (IOException e) { 59 e.printStackTrace(); 60 } 61 } 62 } 63 return null; 64 } 65 66 /** 67 * 計算單詞得分 68 * @param word 英文單詞,不區分大小寫 69 * @return 70 */ 71 public static int coutingScore(String word){ 72 73 //統一大寫 74 word=word.toUpperCase(); 75 76 //掃描計算得分 77 int score=0; 78 for(int i=0;i<word.length();i++) score+=word.charAt(i)-'A'+1; 79 return score; 80 } 81 82 }
生成測試數據的類:
1 import java.io.BufferedWriter; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.io.OutputStreamWriter; 5 import java.util.Random; 6 7 public class Main_020 { 8 9 public static void main(String[] args) throws IOException { 10 11 String savepath="D:/test_001/words.txt"; 12 13 BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(savepath),"UTF-8")); 14 StringBuilder sb=new StringBuilder(); 15 for(int i=0;i<5000;i++){ 16 sb.append(randWord()); 17 if(i!=4999) sb.append(","); 18 } 19 writer.write(sb.toString()); 20 writer.close(); 21 22 System.out.println(sb); 23 } 24 25 public static String randWord(){ 26 //長度[1,20]隨機 27 int length=new Random().nextInt(20)+1; 28 StringBuilder sb=new StringBuilder(length); 29 while(length-->0){ 30 char c=(char) (new Random().nextInt(26)+(new Random().nextBoolean()?'A':'a')); 31 sb.append(c); 32 } 33 return sb.toString(); 34 } 35 36 }
測試類:
1 public class Main_021 { 2 3 public static void main(String[] args) { 4 5 String ans=WordUtils.getHighestScore("D:/test_001/words.txt",",","UTF-8"); 6 System.out.println(ans); 7 8 } 9 10 }
連自加都沒搞明白的弱渣 or 三觀不正 隨便找一條就可以把我干掉啦 :(
EOF