天天看點

CIeNET、IBM實習筆試總結分析

    最近三天筆試了兩場,一場是CIeNET在南理工的筆試,一場是IBM在南大的筆試。總體而言,基礎很重要,準備也很重要,英語的閱讀了解能力更重要,因為題目都是用英文描述的。

CIeNET

    筆試的時候可以選擇技術方向,C、C++、Java。題目不多,十道題,全是主觀題,60分鐘完成,還好允許用中文回答,要不然說起來會比較費勁,畢竟習慣了使用中文術語。考察的都是基礎知識,不難,不過我算裸考的,本以為答的很爛,結果還是收到了面試的通知。這裡有個好玩的事情,宣講會上演講的是CIeNET負責長三角地區的萬女士,她演講的過程中,提到了“程式”這個詞,我當時就猜,她會不會是台灣人,筆試結束後我跑上去一問,哈,果然是,主要是我看了不少侯捷先生翻譯的C++經典,幾乎每次他都會在序言中列出常用詞語翻譯對照表和一些不予翻譯的詞語。呵呵,投機取巧的行為。

    C++題目如下,憑記憶寫下來的,原題為英文。。

Q1:指針與引用的差別,為什麼使用引用更安全?

A:指針與引用都是間接引用其他對象的方法,指針使用操作符*,引用使用操作符&.,指針就是記憶體中的位址,而引用是對象或變量的别名(事實上引用在更底層也是用指針實作的),指針可以不用初始化,而引用必須初始化,而且一旦初始化就不能被改變另一個對象的引用。指針可以空指向,而并不存在空引用,是以引用更安全。

Q2:給函數形參傳遞有幾種方式?函數傳回值又有幾種呢?

A:三種,值,引用,指針,傳回值也是三種,值,引用,指針

Q3:構造函數可以是虛函數嗎?析構函數呢?能否是純虛函數?

A:在C++中,虛函數的作用是用于實作多态,子類根據相同的調用産生不同的行為,這是運作時多态,實作的核心是虛函數指針與虛函數表,而虛函數表與指針是在構造函數中由C++編譯器完成的,是以在C++中構造函數不能是虛函數(虛構造函數這個行為是可以存在的,比如抽象工廠模式);析構函數可以是虛函數,這是為了子類能夠正确調用析構函數,完成自身的資源釋放操作;析構函數也可以是純虛函數,這主要出現在抽象類當中,隻用作繼承。

Q4:定義一下抽象類與虛函數,說明一下各自的主要用途

A:虛函數是面向對象程式設計中的一個重要的概念。當從父類中繼承的時候,虛函數和被繼承的函數具有相同的簽名。但是在運作過程中,運作系統将根據對象的類型,自動地選擇适當的具體實作運作。虛函數是面向對象程式設計實作多态的基本手段。

    抽象類被定義為永遠不會也不能被執行個體化為具體的對象。它往往用于定義一種抽象上的概念,在類的繼承關系中它往往被定義在較上層的位置。在程式設計的實踐活動中,抽象類與接口存在類似的地方,即它更偏重于對共通的方法和屬性進行規約。但與接口存在一個非常大的差異則在于,抽象類往往可以規約一個共同的方法和屬性時提供一個對他們的實作。

Q5:閱讀程式寫出結果

void *GetMemory(char *p,int n)

{

p=(char *)malloc(sizeof(char)*n);

}

void main()

{

char *str=NULL;

GetMemory(str,100);

strcpy(str,”hello”);

printf(str);

A:運作時錯誤,GetMemory傳遞的是指針的值,是普通的值傳遞,是以原來的str并沒有改變,還是空指針,對空指針寫入資料會發生運作時錯誤(這個題目很經典,解決方法是,使用指針的指針,使用指針的引用,或者是傳回指針值)

Q6:不利用庫函數,實作strcpy()函數

A:

char * strcpy(char * dest,char * src)

{

if((dest==NULL) || (src==NULL))

return NULL;

char *copy_str=dest;

while((*dest++=*src++)!=’/0’);

return copy_str;

}

Q7:編寫一個将二進制轉換為十進制的函數

A:懶得寫了。。。

Q8:下面是String類的定義,請編寫實作

class String

{

public:

String(char *str);

String(const String& other);

~String();

String & operator=(String & rhs);

private:

char *m_data;

};

A:

String::String(char *str)

{

m_data=new char[strlen(str)+1];

strcpy(m_data,str);

}

String::~String()

{

delete [] m_data;

}

String::String(const String & other)

{

m_data=new char[strlen(other.m_data)+1];

strcpy(m_data,other.m_data);

}

String & String::operator =(){const String& rhs}

{

if(*this==rhs)

return *this;

if(m_data!=NULL)

delete [] m_data;

m_data=new char[strlen(rhs.m_data)+1];

strcpy(m_data,rhs.m_data);

return *this;

}

Q8:請使用模闆編寫一個堆棧的實作

A:

template<typename T>

struct stack_node_t

{

T data;

struct stack_node* next;

};

typedef struct stack_node_t stack_node

template<typename T>

class stack

{

public:

stack():top(NULL){}

~stack()

{

while(!is_empty())

pop();

}

void push(stack_node data)

{

stack_node * new_node=new stack_node;

new_node->data=data.data;

new_node->next=top;

top=new_node;

}

stack_node *pop(void)

{

if(is_empty())

return;

stack_node * temp=top;

top=top->next;

return temp;

}

bool is_empty()

{

return (top==NULL);

}

private:

stack_node * t

IBM

    IBM實習生即BluePathway項目,先得網上投履歷,然後經過一輪篩選,再進行筆試。我一看我的編号都8000開外了,汗。。。筆試分為兩大部分,第一部分是IPAT,第二部分是技術類,A+C是Java方向,B+C是C++方向。

    前一天白天我把《C/C++就業求職手冊》突擊了二百頁,晚上把以前IBM的實習題目做了一遍(網友收集整理的),這樣還是有點效果的,至少知道個大概情況。

    IPAT又分為三個小部分:13分鐘的矩陣題,三道大題,15道小題;4分鐘的數字找規律題,好像是20道;15分鐘的數學應用題,好像是12道。這一部分考察的最主要就是英語閱讀了解能力了,矩陣題我就做了一半,杯具的是我坐在第一排,結果時間一到卷子馬上就被收走了,不過最後還是給了一個填答案的機會,囧!。數字找規律,做了剩下個5、6道吧,4分鐘時間還是很緊張的。最後數學應用題也有3、4道沒做,主要是分數的計算太煩了。時間緊也就算了,惡心的地方在于,第二第三部分答錯是要倒扣分的。。

    IPAT的考試是考完一部分就收上去,最後的技術類題目時間相對充裕,全是選擇題。不過IBM考的很雜:算法的時間複雜度,空間複雜度,C/C++的基礎(閱讀程式寫結果,占了很大一部分比重),Unix的一些概念、指令,UML圖與設計模式、浏覽器知識,Javascript也考,還是和dom一起,還有xml,網絡知識,等等。以至于我現在都想不起來考了什麼題目。。

    現在隻能等消息了。

繼續閱讀