天天看點

求職路姊妹篇 -- 筆試

     求職路持續更新後,我發現還有個東西可以寫(哈哈,我就喜歡寫東寫西)。筆試時的技術問題,有些沒回答上來或沒回答好的,我可以做一個記錄。友善溫習。

這次參加的筆試,職位是測試工程師,不過題目好像偏軟體工程師。就當把我記得不牢的東西溫習溫習吧~其實還有個資料庫工程師的卷子,不過實在沒時間再去做一份了。一共20題,我隻記得18道了。

     1.廣度優先周遊算法

     分析:這個圖的算法,以前還是記得的。但是确實很久沒有接觸了,前陣子打算再複習的,結果看别的去了。筆試的時候有點點映像,但是它是第二題,我不想在這上面耗費太多的時間,結果試卷完後好多不會。就幹脆沒做了。

     廣度優先搜尋周遊類似于樹的層次周遊。其中必須設立一個隊列來儲存通路過的節點,算法描述如下,

     1)從圖中標明一個節點V0作為出發點。

     2)通路V0。

     3)将通路過的節點V0入隊。

     4)當隊列不空時,進入循環:

          節點Vi出隊。

          通路與Vi有邊相連的且未被通路過的所有節點Vj。

          通路過的節點Vj入隊。

      5)當隊列為空時,循環結束,說明從V0開始能夠到達的所有節點都已被通路過。

      廣度優先周遊算法如下(C++):

typedef int dataType;
#include "Queue1.h"

void Graph1::breadthfs(int k)
{
      Queue1 q1(vertCount);   //vertCount 圖的節點數
       int i = k;
       cout<<vertex[i]<<"  ";   //char vertex[] 圖的節點集合
       vertex[i] = 1;
       q1.enQueue(i);
       while(!q1.isEmpty())
       {
               i = q1.deQueue();
               int j = 0;
               while(j<vertCount)
               {
                      if(i != j && mat[i][j]>0 && mat[i][j]<MaxWeight && visited[j]==0)      //int mat[][] 圖的鄰接矩陣
                     {
                            cout<<vertex[j]<<" ";
                            visited[j] = 1;  //int visited[] 通路标記數組
                            q1.enQueue(j);
                     } 
                     else
                            j++;
               }
       }
}
           

順便複習下深度優先周遊算法:深度優先搜尋周遊類似于樹的先根周遊。其遞歸算法描述如下,

  從圖中標明的一個節點v0出發。

  通路v0.

  查找與v0有邊相連且未被通路過的另一個節點vj。

  若有vj,從vj出發繼續進行深度優先搜尋周遊。

  若找不到vj,說明v0開始能夠到達的所有節點都已經被通路過,周遊結束。

深度優先周遊算法如下(C++):

void Graph1::depthfs(int k)
{
   int i=k,j=0;
   cout<<vertex[i]<<" ";
   visited[i]=1;
   while(j<vertCount)
   {
        if(i!=j && mat[i][j]>0 && mat[i][j]<MaxWeight && visited[j]==0)
        {
                 depthfs(j);   //遞歸
        }
        else
                   j++;
   }
}
           

2.畫出在windows下進行socket通信的簡單模型

分析:當時我隻記得socket是伺服器和用戶端的通信機制,那還是大一看孫鑫老師的MFC時記的筆記,當時還做了個簡單的通信工具,現在不知道有多少年沒碰了,印象最深的是有三次“握手”。結果畫了個錯誤的模型圖。

我想應該就是下面這個圖,如果不對,請指出。

求職路姊妹篇 -- 筆試

3.用純C寫輸入一字元串,并逆轉輸出。

分析:去年暑假的時候,買了本計算機等級考試的書,裡面就是純C的,我利用項目的空閑時間做完了這本書。但是當時認為我學的是C#,就沒有很關注C的文法,值看題目的對錯去了。想用char指針的方法,但是也忘光了。我的方法差不多是下面這個樣子,用了一個字元數組的方法,通過for循環倒着輸出來了。肯定是杯具~

#include <stdio.h>
#include <string.h>
void main(void)
{	
char str[100];	
int len, i;	
while(gets(str) != NULL) /* Ctrl+Z結束循環 */	
{		
len = strlen(str);		
for(i = len-1; i >= 0; --i)
     putchar(str[i]);
putchar('\n');	
}
}
           

網上有個理想的方法,但我不知道是不是最高效的,還有一些其他的就不列舉了:

#include<stdio.h>
#include<string.h>
void func(char *s)
{
char *p1, *p2;
char c;
p1 = s;
p2 = s + strlen(s) - 1;
while(p1 < p2)
{
c = *p1;
*p1 = *p2;
*p2 = c;
p1++;
p2--;
}
}
void main()
{
char s[] = "sdlkfjslkdfja";
func(s);
printf("%s\n", s);
}
           

4.接口和類的異同。

分析:本來剛看完The C# Programming Language這本書,這道題應該可以答得很好才對。結果也不盡理想,相異的地方還是寫出一些。相同感覺太多了啊!

異:

不能直接執行個體化接口。  //ok

接口不包含方法的實作。 //ok

接口、類和結構可從多個接口繼承。但是C# 隻支援單繼承:類隻能從一個基類繼承實作。 //no

類定義可在不同的源檔案之間進行拆分。//no

同:

接口、類和結構可從多個接口繼承。//ok

接口類似于抽象基類:繼承接口的任何非抽象類型都必須實作接口的所有成員。 //no

接口可以包含事件、索引器、方法和屬性。//no

一個類可以實作多個接口。//no

5.用C/C++寫一個深度為xxx,寬度為xx的環形緩沖區。

分析:xxx是有具體數字的,我忘記了。但是這個題目直接無語。

/*ringbuf .c*/
#include<stdio.h>
#include<ctype.h>
#define NMAX 8
int iput = 0; /* 環形緩沖區的目前放人位置 */
int iget = 0; /* 緩沖區的目前取出位置 */
int n    = 0; /* 環形緩沖區中的元素總數量 */
double buffer[NMAX];
/* 環形緩沖區的位址編号計算函數,,如果到達喚醒緩沖區的尾部,将繞回到頭部。 ** 環形緩沖區的有效位址編号為:0到(NMAX-1) */
int addring (int i){    return ((i+1) == NMAX )? 0 : i+1;}
/* 從環形緩沖區中取一個元素 */
double get(void)
{   
 int pos;   
 if (n>0){      
  pos = iget;    
  iget = addring(iget);   
  n--;       
  return buffer[pos];    
  }    else {  
      printf("Buffer is emptyn");     
   return 0.0;    
  }
}
/* 向環形緩沖區中放人一個元素*/
void put(double z)
{    
if (n<NMAX)
{       
 buffer[iput]=z;     
 iput = addring(iput);  
 n++;    
}   
else  
printf("Buffer is fulln");
}

int main(void)
{   
  char opera[5];  
  double z;    
  do     
  {        
    printf("Please input p|g|e:");  
    scanf("%s", &opera);    
    switch(tolower(opera[0]))  
    {            
      case 'p': /* put */        
         printf("Please input a float number:");     
         scanf("%lf", &z);          
         put(z);              
         break;        
      case 'g': /* get */        
        z = get();               
        printf("%8.2f from Buffern", z);   
        break;        
      case 'e':              
        printf("Endn");       
        break;             
      default:              
        printf("%s - Operation command error! n", opera);   
     }/* end switch */    
    }while(opera[0] != 'e');   
  return 0;
}
           

也不知道這個對不對,應該沒這麼長的程式,可能就是這兩句吧:

double buffer[NMAX];

int addring (int i){    return ((i+1) == NMAX )? 0 : i+1;}

6.線程和程序的差別,然後講講同步和互斥。

分析:線程和程序的差別還是記得的。但是我想回答也不全面,至于同步和互斥。知道有這個概念,并且我部落格上不還有個弄錯了的程序同步的例子麼。

請參看:http://www.cnblogs.com/kulong995/archive/2008/10/10/1307952.html#1443479

呵呵。可惜,秃頭老師的Mutex猶在耳邊,而我依然隻有模糊的概念而已。

這位仁兄跟我差不多:http://www.ezloo.com/2007/10/thread_process_program.html

我也隻是知道線程是程序的一部分,程序是程式的一部分。更具體的差別見下面:

1、線程是程序的一部分,是以線程有的時候被稱為是輕權程序或者輕量級程序。

2、一個沒有線程的程序是可以被看作單線程的,如果一個程序内擁有多個程序,程序的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。

3、系統在運作的時候會為每個程序配置設定不同的記憶體區域,但是不會為線程配置設定記憶體(線程所使用的資源是它所屬的程序的資源),線程組隻能共享資源。那就是說,出了CPU之外(線程在運作的時候要占用CPU資源),計算機内部的軟硬體資源的配置設定與線程無關,線程隻能共享它所屬程序的資源。

4、與程序的控制表PCB相似,線程也有自己的控制表TCB,但是TCB中所儲存的線程狀态比PCB表中少多了。

5、程序是系統所有資源配置設定時候的一個基本機關,擁有一個完整的虛拟空間位址,并不依賴線程而獨立存在。

7.在一張表内(具體表大概就是工資,部分,人員,薪水之類的)用一條sql語句選擇出除了hr_depart部門的平均薪水,并對人員字元排序。

PS:這道題應該記錯了,可能是對低于部門平均薪水的人排序。

分析:當時以為隻是簡單的select where orderby的。結果發現不對勁。自從發現了Sql server可以利用視圖自動生成sql語句後,我就懶了。最後一次寫sql語句貌似也是半年前了(這半年我幹嘛去了?)。而且平常老是問人,要不就是搜尋。很少自己靜下心來構造T-Sql。結果我的語句肯定寫錯了,但還是硬着頭皮寫了一點。不能讓人誤會我完全不會Sql啊!

這道題我自己待會去資料庫上建個表試一試,總感覺怪怪的。

8.選擇(num int(32))中最小的數,但不能用min和max。

分析:當時看到覺得不知道,後來想了個笨辦法。選擇按從小到大排序後的第一個結果。select top 1 from num orderby num desc.

沒找到更合适的答案,這裡有個園友碰到個更BT的,同時查最大值和最小值:http://www.cnblogs.com/wszhe/archive/2007/07/20/824815.html

也有可能是我記錯題了,就是要查最大和最小值。

9.final,finally,finallize的差別

分析:說實話,我隻見過finally。是以這道題又沒答。好吧,我發現這是java題。

final--如果一個類被聲明為final,意味着它不能再派生出新的子類,不能作為父類被繼承。是以一個類不能既被聲明為abstract的,又被聲明為final的。将變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以後的引用中隻能讀取,不可修改。被聲明為final的方法也同樣隻能使用,不能重載。

finally—在異常處理時提供 finally 塊來執行任何清除操作。如果抛出一個異常,那麼相比對的catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。 finalize —方法名。Java 技術允許使用finalize() 方法在垃圾收集器将對象從記憶體中清除出去之前做必要的清理工作。一旦垃圾回收器準備好釋放對象占用的空間,将首先調用其finalize()方法,并且在下一次垃圾回收動作發生時,才會真正回收對象占用的記憶體。它是在 Object 類中定義的,是以所有的類都繼承了它。子類覆寫 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器删除對象之前對這個對象調用的。垃圾回收隻與記憶體有關,隻是以會用finalize()方法,是由于在配置設定記憶體時采用了類似C語言的做法,這種情況主要發生在使用“本地方法”的情況下,本地方法采用的是非java代碼方式,本地方法目前隻支援C和C++,在非java代碼中也許會調用到C的malloc()函數系列來配置設定存儲空間,而且除非調用了free()函數,否則存儲空間将得不到釋放。

更具體的研究請參看:http://blog.csdn.net/yakihappy/archive/2009/03/11/3979759.aspx

插播廣告:) google讓我們的生活更美好~\(^o^)/~其實我應該給自己一闆磚,我應該用必應的。

10.面向對象技術的特點。

分析:我覺得這個題如果答不上來可以去撞死了。好吧,我去找塊豆腐來撞吧~由于越來越沒信心。我居然就這麼答了:繼承,多态,封裝,隐藏。天天用面向對象的C#來寫程式,居然忘了它的特點了,那是看園子裡濤哥的《你必須知道的.NET》,奉若珍寶。你不知道?out了吧~http://www.cnblogs.com/anytao/ 等我回憶下。。。好像是1年半前。哎,很多東西也随着時間一起給流逝了。

面向對象的三個基本特征是:封裝、繼承、多态。請見:http://www.svn8.com/uml/OOAD/uml200907127306.html

百度百科有多個抽象。請見:http://baike.baidu.com/view/1520586.htm?func=retitle

11.解釋什麼是中斷重X。(通過谷歌的幫助下,可重斷中斷)。

PS:可能又記錯題了,是不是函數的重入呢。剛好看到這個概念。

分析:又不知道,又沒答。

好吧,我連搜都搜不到,請知道的園友告知一聲吧。

所謂的函數是可重入的(也可以說是可預測的),即:隻要輸入資料相同就應産生相同的輸出。

12.String s = new String("abc");一共配置設定了幾次記憶體。

分析:前幾天園子裡不是有位朋友面試時碰到這個問題麼,當時我還想,是兩次吧(不要有“吧”)!結果自己寫的時候又猶豫了,但是我還是寫的兩次。

後來回家後,我請教了Gray,他的回答如下:”棧空間配置設定了2次,堆不一定,會有intern的吧,而且我也不知道編譯器會不會在這一句上作優化,就像會把""優化成String.Empty“ 具體的配置設定: ”棧空間第一次配置設定一個指針指到"abc",第二次配置設定出來給new string("abc")啊 第二次的棧指針有個名字叫s,應該是這樣了 “

濤哥的書上應該有,但是我現在沒書。

13.static 函數 和 static 變量各自的特點。

分析:當時我怎麼想的呢,我覺得這問的應該是C或C++裡面的吧。但是又不熟悉。就隻好寫了自己熟悉的C#裡面的情況。

關于C裡面的這個不錯:http://hi.baidu.com/gtfcugb/blog/item/57b836dd6e11f5e976c638f1.html

14.&和&&的差別。

分析:這個前兩天看到了,&不是短路運算 ,而&&是短路運算符。

這個應該沒有問題吧?

15.adp.net中常用的對象。

分析:這個我隻回答出了Connection和Command對象。

Connection          打開資料庫連接配接

Command         執行資料庫指令

DataAdapter     連接配接資料,執行資料庫指令,填充DataSet

DataSet         資料在記憶體中的緩存,資料結構

DataReader          隻讀向前的讀取資料庫

更詳細的可以參看:http://www.phome.net/document/net/200504/net111246243813950.html

    還記得的3題是其他内容的,濾波器什麼的,更加不懂。就不在這裡記錄了。

    通過這次筆試,讓我明白自己最近半年所關注的内容全是趕着時髦的技術,像Linq,WPF,而自己又沒有能力好好的掌握。作為一個學生,書本上的知識快忘光光了,卻還在想着需求分析怎麼寫,概要設計怎麼寫,詳細設計怎麼寫,該怎麼做項目。其實我早應該出去找地方實習了,而不是一味的自己瞎幹。眼看大學就快要畢業了,曾經以為自己不迷茫了,結果發現自己還是雲裡霧裡的在學習,原來是越來越迷茫了。也不知道自己的精力該放在哪裡了。

     很久沒有發過園子裡的首頁了,記得第一次來部落格園稀裡糊塗的發到首頁被罵個半死,就再也不敢亂發了。這次借着這個機會,一方面希望可以給即将畢業,正在面試求職的戰友們一點點幫助,順便大家可以一起來交流面試求職的心得。另一方面,想請園子裡的前輩們,能開導下我這個即将步入社會的年輕人。該怎麼樣才能在這個行業幹得愉快。發現自己懷着很好的心情開始寫這篇随筆,到後來卻心情沉重。

PS:如果大夥覺得這樣放筆試題有問題,我會馬上撤銷這篇随筆。希望沒有問題:)呵呵~如果有跟我一樣困惑的朋友,歡迎加群:30918609 一起來讨論。

轉載于:https://www.cnblogs.com/kulong995/archive/2010/03/05/1679338.html