筆試總結篇(一) : 廣州X公司筆試

一.單選題:javascript

Ps : 當時因爲去廣州路上顛簸很困,致使剛作幾分鐘題目就睡了一覺。起來發現20分鐘過去了。擦擦!java

1. 假設磁盤文件foobar.txt 由 6個ASCII 碼字符「foobar」 組成,那麼程序的輸出是什麼?python

 

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 int main(int argc, char const *argv[])
 5 {
 6     int fd1, fd2;
 7     char c;
 8     fd1 = open("foobar.txt", O_RDONLY);
 9     fd2 = open("foobar.txt", O_RDONLY);
10     read(fd1, &c, 1);
11     read(fd2, &c, 1);
12     printf("c=%c\n", c);
13     return 0;
14 }

A.f B.o C.b D.aios

個人思路是 先從fd1 指向文件裏面讀一個字符賦給字符c,以後在從fd2 裏面讀一個字符賦給字符c,固然是覆蓋了,因此是 f 若是第二個read裏面讀的是fd1 文件描述副,那麼答案就應該是 o,由於讀了兩次。o會覆蓋以前的c。面試

 

2.仍是foobar.txt文件,下面程序的輸出是什麼?
算法

 1 #include <stdio.h>
 2 #include <fcntl.h>
 3 #include <unistd.h>
 4 
 5 int main(int argc, char const *argv[])
 6 {
 7     int fd;
 8     char c;
 9     fd = open("foobar.txt", O_RDONLY);
10     if(fork()==0){
11         read(fd, &c, 1);
12         return 0;
13     }
14     wait(NULL);
15     read(fd, &c, 1);
16     printf("c=%c\n", c);
17     return 0;
18 }

A.f B.o C.b D.a數據庫

這道題是 o 由於父親等孩子退出以後才能進行第二次讀操做,畢竟前面有wait 要先等待孩子執行完,父進程才能夠執行編程

 

3.仍是foobar.txt 下面程序輸出是什麼?數組

 

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 
 5 int main(int argc, char const *argv[])
 6 {
 7     int fd1, fd2;
 8     char c;
 9     fd1 = open("foobar.txt", O_RDONLY);
10     fd2 = open("foobar.txt", O_RDONLY);
11     read(fd2, &c, 1);
12     dup2(fd2, fd1);
13     read(fd1, &c, 1);
14     printf("c=%c\n", c);
15     return 0;
16 }

A.f B.o C.b D.a服務器

仍是 o ,考察的是dup2 重定向用法,也就是說 是fd1描述符指向fd2, 對fd1操做的時候,就是間接對fd2 進行操做,因此第二次read操做是讀的fd2文件。

 

4.一下編程語言不是解釋執行的是?

A Javascript     B Python  C  JAVA  D Pascal

從表面上看:javascript解釋執行語言,不須要編譯器的介入, 服務器只對動態腳本進行解釋或執行
Python 腳本語言  固然也是解釋執行
JAVA 由虛擬機編譯,因此也是解釋執行。
畢竟Pascal 是各大OJ都有的語言,求速度,編譯型語言的程序執行效率高,因此Pascal是編譯型語言。

從本質上看:考編譯語言和解釋語言的區別,編譯語言寫的程序執行以前須要專門的編譯過程,把程序編譯成爲機器語言的文件,例如exe,以後運行後就不用從新編譯了。直接使用exe文件就OK了,畢竟編譯一次,屢次運行。效率搞。
解釋語言不須要編譯,在運行的時候才編譯,例如JAVA,專門有一個解釋器來執行,這樣每執行一次就要翻譯一次,效率不高。

 

5. 設有CMyClass類的對象a , 那麼語句CMyClass b = a; 會調用CMyClass類的?

A 內存拷貝函數      B 賦值運算符重載函數     C 拷貝構造函數   D 以上都不對

看C++就鬱悶,對C++根本一點不懂,但這不是放棄這道題的藉口。
一點點了解先:
內存拷貝函數:這個C庫函數 memcpy 就是實現這個的,跟C++ 類關聯不大,因此第一個排除,但既然有考到,就把memcpy 深深瞭解一下

void *memcpy(void *dest, const void *source, size_t count)
{
     assert((NULL != dest) && (NULL != source));
     char *tmp_dest = (char *)dest;
     char *tmp_source = (char *)source;
      while(count --)//不對是否存在重疊區域進行判斷
      *tmp_dest++ = *tmp_source++;
     return dest;
}

 

和字符串拷貝strcpy是有區別的。

這道題目 主要考 賦值運算符重載函數 和 拷貝構造函數區別,簡單的說,拷貝構造函數是用一個已存在的對象去構造一個不存在的對象,也就是初始化一個對象,而賦值運算符重載函數是用一個存在的對象去給另外一個已存在而且初始過的對象進行賦值。

好比:String s1("hello"),s2=s1;//拷貝構造函數
Sring s1("hello"),s2;
s1=s2;//賦值運算符重載

因此答案
很明顯是 拷貝構造函數

 

6.下列代碼 將打印出:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a[8] = {0,1,2,3,4,5,6,7};
    int *b = a;
    b+=3;
    if(*b % 2)  b+=2;
    printf("%d\n", *b);
    return 0;
}

 

A 0  B 3   C  5  D  7

答案:5  顯而易見!

 

7. 以下代碼會輸出:

#include <iostream>
using namespace std;

class Echo{
public:
     Echo(){cout << "+";}
     ~Echo(){cout << "-";}
}a;

int main(int argc, char const *argv[])
{
     cout << "s";
     Echo e;
     return 0;
}

A: +-s+-
B:   +s+--
C:  s+-
D   s+-+-

當時想選s+-了,以後發現其餘三個答案都有雙+雙減法,必定是看漏了什麼,才發現,原來有個小a在class {...} 後面,這樣考的是兩個構造函數加析構函數和輸出s 之間的順序,應該是B.

8.關於數據庫的題目,貌似是不會用到索引的是哪一項。果斷放棄,不說緣由。

9. 如下不是操做系統的進程調度算法的是?

A 輪轉法  B 最短CPU運行期優先調度算法    C 先進先出算法  D 電梯式調度算法

果斷選電梯了,由於這名字太土啦。 剛學操做系統,尚未講到調度,不過有看過一點書,並且騰訊面試問到我關於調度,因爲剛學操做系統,還沒學到調度,因此慘敗在操做系統當中。

10. 二叉樹遍歷,給你前序中序,求後序,這種數據結構題目就不提了。

11. C代碼中整數不能是用哪一種進製表達?

A 2進制  B 十六進制  C 十進制  D 八進制

C語言中不能表示二進制,八進制用零開始的數字表示,如032,十六進制用0x開始的數字表示,如0x3f 

 

12. 阻塞的 accept 返回發生在三次握手的哪一個階段?

A 服務端收到客戶端的SYN
B 服務端發出客戶端SYN的ACK
C 服務端收到客戶端對SYN的ACK
D 客戶端收到服務端的SYN和ACK

第一次握手:客戶端發送syn包(syn=j)到服務器。
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個ASK包(ask=k)。
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1)。
三次握手完成後,客戶端和服務器就創建了tcp鏈接。這時能夠調用accept函數得到此鏈接
這題目是否是有問題??沒選項呀。發生在三次握手以後,只能選第三個階段了。

 

13. 如下說法錯誤的是?

class Widget{
     public:
          Widget();
          Widget(const Widget &rhs);
          Widget& operator = (const Widget &rhs);
};

bool foo(Widget w){
     .....
}

Widget w1 //語句1
Widget w2(w1); //語句2
w1 = w2;
foo(w1);

A 語句1調用 Widget();
B 語句2調用 Widget(const Widget &rhs);
C 語句3調用 Widget& operator=(const Widget &rhs);
D 語句4調用 Widget& operator=(const Widget &rhs);

這道題目應該仍是考拷貝構造函數,賦值重載函數,語句1調用了構造函數,語句2調用了拷貝構造函數,語句三是利用了賦值運算符重載函數,語句4是什麼東東?貌似是調用了拷貝構造函數。排除法選D

14.請給出func(65535)的返回值

int func(intx){
     int countx = 0;
     while(x){
          countx++;
          x = x&(x-1);
     }
     return countx;
}

A 65535  B 65536  C 15  D 16

這道題目出自K&R《程序設計語言》課後題 2-9,今年暑假有作個這個練習,  x&=(x-1) 是求x轉化爲2進制中1的個數,因此是16.

 

15. 請給出下面程序在32bit 小端機器上的輸出?

#include <stdio.h>
typedef union{
     char a;
     char b;
     int c;
}Demo;

int main(int argc, char *argv[]) {
     Demo demo;
     demo.a = 'a';
     demo.b = 'b';
     demo.c = 0x64636261;
     printf("size:%zu a:%c b:%c \n", sizeof(demo), demo.a, demo.b);
     return 0;
}

 

這題目出題有問題,沒有正確答案。若是必定要選一個,應該是B

A size:4 a:  b:a  c:b
B size:4 a:  b:a  c:a
C size:4 a:  b:d  c:c
D size:4 a:  b:d  c:d

雖然題目有問題,但它仍是很經典的題。考了大小端模式,大端模式地址的增加順序與值的增加順序相同,小端模式是與值的增加順序相反
例如 : 0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
在大端模式下,前16位應該這樣讀: e684
在小端模式下,前16位應該這樣讀: 84e6

不過若是站在出題的人的角度上,答案應該是 B,代碼錯誤應該打印c ,應該是 a:a b:a c:a

#include <stdio.h>
typedef union{
     char a[4];
     int c;
}Demo;

int main(int argc, char *argv[]) {
     Demo demo;
//     demo.a = 'a';
//     demo.b = 'b';
     demo.c = 0x64636261;
     demo.a[1] = 'e';
     printf("%d\n", sizeof(char));
     printf("size:%zu a:%c a:%c a:%c a:%c c:%c\n", sizeof(demo), demo.a[0], demo.a[1], demo.a[2], demo.a[3], demo.c);
     return 0;
}

 

16. C語言的設計發明者是 ?

A. Dennis Ritchie
B. Brian Kernighan
C. John McCarthy
D. Bjarne Strou-strup

答案是A,《C程序設計語言這本書》就是C語言的爸爸寫的。Brian Kernighan也是其做業,可是沒有參與C語言的研究,AWK 和 AMPL 編程語言的做者就是Brian Kernighan. John McCarthy是發明Lisp語言的做者,Lisp語言的強大是C沒法比擬的。Bjarne Strou-strup是C++的發明者。變態呀。發明出如此變態的語言。

17.下列STL容器中,邏輯上相鄰的兩個元素,內存上必然相鄰的是?
A vector   B set  C list   D map

vector 是一個可以存聽任意類型的動態數組的容器,內存應該相鄰。
set 實現採用了紅黑樹的平衡二叉樹,所以內存不必定相鄰
list 是鏈表結構,map是 key value 鍵值對,所以也不必定相鄰。

18.下列代碼片斷正確的是:

A int a, &b;b=a;     B . int arr[][] = {{11, 2} ,{0}};
C typedef void x(int, double);
D const int s; int arr[s] = {0};

A中 b沒有定義,&b是b的地址 .
B中 定義二維數組貌似前一個括號內是有數字的。這個編譯百分百錯誤。就算是python 也不能夠這樣寫。
C 編譯是沒問題的。我認爲是正確的。只是不多有人這麼用。
D  const int s 後面應該賦值,假如 const int s = 1 應該是正確的,沒有賦值的話編譯不會經過。

 

 

19. 一個模版函數定義爲:

template<typename T1, typename T2> void foobar(T1 a, T2 b=0);
則下列調用語法錯誤的是:
A foobar <int , int>(1,2)   B foobar(1, "c");   C foobar<double, double>(1.1,2);  D foobar(1);

當時學JAVA的時候記得 模版就是泛型,能夠代替  任意變量 例如 int  double 等等,可是變量不能爲一個,畢竟聲明2兩個 T1 T2 ,因此D 顯然是不對的。

每次筆試遇到C++,都很頭痛。

 

20. 一下程序輸出是什麼?

 

#include <iostream>
using namespace std;

class A
{
     public:
          A(){printf("A");}
          virtual ~A(){printf("~A");}
};

class B:A
{
     public:
          B(){printf("B");}
          virtual ~B(){printf("~B");}
};

class C
{
     public:
          C(){printf("C");}
          ~C(){printf("~C");}
};

class D:B{
     public:
          D(){printf("D");}
          ~D(){printf("~D");}
          C c;
};

int main(int argc, char *argv[]) {
     D d;
     return 0;
}

 

A.  ABCD~D~C~B~A
B.  ABCD~A~B~C~D
C.  ABDC~C~D~B~A
D.  DCBA~A~B~C~D

這道題目選的是A ,這道題目用到了虛函數,我不是很理解,一會在討論虛函數。以後補充


二:多選題  (漏選不得分)->尼瑪這不坑人麼?阿里巴巴 選錯還反扣分,更無語。

最近不少題目要注意32Bit  64bit 畢竟有些題目設計操做系統的話,答案是不一樣的。


1.又是一堆代碼,吃完晚飯在寫。。。。待續。。

相關文章
相關標籤/搜索