2021年奇虎360程序開發面試題

小編:管理員 406閱讀 2021.06.24

第1題:


一、單選題

1、上高中的小明暗戀女神三年,高考結束后,小明決定向女神表白。這天,小明來到女神樓下等待女神的出現,時間一分一秒的流逝,兩個多小時過去了,女神還沒有出現,小明看了下表,時針和分針的位置正好跟開始等的時候互換,請問小明一共等了女神多少分鐘()      

A、172

B、166

C、165

D、150



1、B

設一圈為1 

設時針和分針距離x(時針順時針走x圈到分針位置),則

分針走了3-x圈,時針走了x圈

因為分針移動60格時針移動5格,兩針的速度比是分針:時針=12:1

所以3-x=12x,x=3/13

所以分針走了36/13圈,每圈60min,總時為166.1538


第2題:


 2、有A,B,C三個學生,一個出生在北京,一個出生在上海,一個出生在廣州。他們中一個學物理專業,一個學數學專業,一個學計算機。其中(1)A不是學物理的,B不是學計算機的;(2)學物理的不出生在上海;(3)學計算機的出生在北京;(4)B不出生在廣州。請根據上述條件,判斷A的專業()。

A、物理

B、數學

C、計算機

D、3種專業都可能



 2、C

計算機在北京,物理在廣州,數學在上海

B不出生在廣州也不是學計算機的,所以是學數學的在上海

A不是學物理的,所以A是學計算機的


第3題:


 3、一個不透明的箱子里共有紅,黃,藍,綠,白五種顏色的小球,每種顏色的小球大小相同,質量相等,數量充足。每個人從籃子里抽出兩個小球,請問至少需要多少個人抽球,才能保證有兩個人抽到的小球顏色相同?        

A、6個

B、11個

C、13個

D、16個



 3、D

每個人要從敏感詞中抽2個球,5種顏色的組合球的情況有:

兩個球不同的情況:C5   2=5*4/2=10種情況

兩球相同:5種情況

所以最壞的情況時,前15個人,抽的球都不同

則第16個肯定會抽的與前面的人有相同的


第4題:


 4、平面內有11個點,由它們連成48條不同的直線,由這些點可連成多少個三角形?        

A、158

B、160

C、162

D、165



 4、B

11個點可以連接成55條線,這里只有48條,所以有一組三個點共線有一組四個點共線,所以三角形個數為C3 11  -C3 3   -C3 4 =160個三角形。缺的線55-48=7條 三個點共線缺兩條,四個點共線缺五條。


第5題:


5、8,8,12,24,60()      

A、90

B、120

C、180

D、240



5、C

從左到右,后一個數是前一個數的1倍、1.5倍、2倍、2.5倍、3倍

即第n個數是第(n-1)(n>1)這個數的n*0.5倍

所以:第六個數為 6*0.5*60=180


第6題:


 6、假定x-65530,下面函數的返回值是多少?()

int func(x)

{

    int countx = 0;

    while (x)

    {

        countx++;

        x = x & (x - 1);

    }

    return countx;

}

A、100

B、14

C、20

D、16



 6、B
函數的作用是統計x二進制數中1的個數。
這個作用是對整型中1的個數進行統計,x=x&(x-1);的作用是每次循環把x的二進制中從右往左數的最后一位1變成0,直道變成全0為止,循環結束。
65530的二進制是0000 0000 0000 0000 1111 1111 1111 1010,所以結果是14
還有類似的題目,迭代式為x=x|(x+1),作用是統計x二進制中0的個數


第7題:


 7、用某種排序方法對關鍵字序列(25,84,21,47,15,27,68,35,20)進行排序,序列的變化情況采樣如下:
20,15,21,25,47,27,68,35,84
15,20,21,25,35,27,47,68,84
15,20,21,25,27,35,47,68,84
請問采用的是以下哪種排序算法()

A、選擇排序

B、希爾排序

C、歸并排序

D、快速排序



 7、D

首先第一步以25為基礎,小于25的放在25的左邊,大于25的放在25的右邊

得到20,15,21,25,47,27,68,35,84

第二步在25的兩邊分別進行快速排序,左邊以20為基數,右邊以47為基數

得到15,20,21,25,35,27,47,68,84

第三步將,35,27這個子序列排序,得到

15,20,21,25,27,35,47,68,84


第8題:


 8、設某顆二叉樹中有360個結點,則該二叉樹的最小高度是?      

A、10

B、9

C、8

D、7



 8、B

深度為h的二叉樹最多有2^h-1個節點,因此h最小取9


第9題:


 9、下列哪個算法是對一個list排序的最快方法()       

A、快速排序

B、冒泡排序

C、二分插入排序

D、線性排序



 9、A

list采用鏈式結構存儲,在C++    STL中的list采用雙向鏈表存儲,比較適合用快速排序進行排序,這是由快速排序不需要隨機訪問元素的特點決定的。

冒泡排序適合list,但是算法復雜度為O(n^2),沒有快速排序快。

二分插入排序算法適合順序存儲情況,不適合鏈式存儲


第10題:


10、應用程序PING發出的是什么報文()        

A、TCP請求報文

B、TCP應答報文

C、ICMP請求報文

D、ICMP應答報文



10、C

Ping程序一般用來測試一臺主機是否可達,該程序發送一份ICMP回顯請求報文給主機,并等待返回ICMP回顯 應答。


第11題:


 11、

digit ->0|1|...|9
digits ->digit digit*
optionalFraction ->.digits|∈
optionalExponent ->(E+|-|∈)digits)|∈
number -> digits optionalPraction option|Exponent
上面給出的正則規約的描述中,下面的無符號數哪個不符合規約的要求:       

A、5280

B、1

C、2.0

D、336E4



 11、D

336E4改成336E+4或者336E-4就正確了。


第12題:


 12、語法分析器可以用于()    

A、識別語義錯誤

B、識別語法和語義錯誤

C、識別語法錯誤

D、識別并修正語法,語義錯誤



 12、C

在計算機科學和語言學中,語法分析(英:Syntacticanalysis,也叫Parsing)是根據某種給定的形式文法對由單詞序列(如英語單詞序列)構成的輸入文本進行分析并確定其語法結構的一種過程。
語法分析器(Parser)通常是作為編譯器或解釋器的組件出現的,它的作用是進行語法檢查、并構建由輸入的單詞組成的數據結構(一般是語法分析樹、抽象語法樹等層次化的數據結構)。語法分析器通常使用一個獨立的詞法分析器從輸入字符流中分離出一個個的“單詞”,并將單詞流作為其輸入。實際開發中,語法分析器可以手工編寫,也可以使用工具(半)自動生成。


第13題:


 13、IPV6地址包含多少位()

A、16

B、32

C、64

D、128



 13、D

IPV6地址有128位二進制數組成。每四個二進制數組成一個十六進制數,有128/4=32個十六進制數

每四個十六進制數為一組,中間用冒號隔開。如XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX

如果XXXX四位是全零,可以省略寫成::形式


第14題:


 14、如果在一個建立了TCP連接的socket上調用recv函數,返回值為0,則表示()            

A、對端發送了一段長度為0的數據

B、對端關閉了連接

C、還沒有收到對端數據

D、連接發生錯誤



 14、B

如果recv函數在等待協議接收數據時網絡中斷了,那么它返回0。默認 socket 是阻塞的。阻塞與非阻塞recv返回值沒有區分,都是 <0 出錯 =0 連接關閉 >0 接收到數據大小


第15題:


 15、以下哪些不是內核對象()

A、進程

B、線程

C、互斥器

D、臨界區



 15、D

臨界區是資源對象,只能被一個進程訪問


第16題:


16、同一進程下的多個線程可以共享哪一種資源()  

A、stack

B、data section

C、register set

D、thread ID



16、B

線程共享的環境包括:進程代碼段、進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊)、進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。


第17題:


 17、優異虛擬存儲系統,若進程在內存中占3頁(開始時內存為空),若采用先進先出(FIFO)頁面淘汰算法,當執行以下訪問頁號序列后1,3,4,2,1,3,5,1,2,5,4,2,會產生多少次缺頁()         

A、7

B、8

C、9

D、10



 17、 C

缺頁定義為所有內存塊最初都是空的,所以第一次用到的頁面都產生一次缺頁。

內存塊數是3時:

FIFO 1, 3, 4, 2, 1, 3, 5, 1, 2, 5 ,4, 2

         1  1  1  2  2  2  5      5      5

             3  3  3  1  1  1      2      2

                 4  4  4  3  3      3      4

缺頁   x  x  x  x  x  x  x      x      x

所以缺頁數為9.選C


第18題:


 18、下述哪種情況會提出中斷請求()     

A、在鍵盤輸入過程中,每按一次鍵

B、兩數相加結果為零

C、計算結果溢出

D、一條系統匯編指令執行完成



 18、A

“緊急事件”須向處理器提出申請(發一個電脈沖信號),要求“中斷”,即要求處理器先停下“自己手頭的工作”先去處理“我的急件”,這一“申請”過程,稱——中斷請求。


第19題:


 19、單任務系統中兩個程序A和B,其中
A程序:CPU:10s -> 設備1:5s -> CPU:5Ss ->設備2:10s ->CPU:10s;
B程序:設備1:10s-> CPU:10s -> 設備2:5s ->CPU:5s ->設備2:10s;
執行順序為A->B,那么CPU的利用率是()

A、30%

B、40%

C、50%

D、60%



 19、C
A程序,CPU時間為10+5+10=25s,總時間為10+5+5+10+10=40s;
B程序,CPU時間為10+5=15s,總時間為10+10+5+5+10=40s;
CPU總時間為40s,兩個進程的總時間為80s,
CPU的利用為40/80=0.5


第20題:


 20、

for (int i = 0; i < 2; i++)

{

    fork();

    printf("-\n");

}

會打印出多少個"-"?

A、4

B、5

C、6

D、8



 20、C
fork()函數是通過系統調用實現進程的拷貝。
第一次for循環,執行完fork函數之后,系統中有兩個一模一樣的進程,并且都執行到printf函數處,這一次循環會打印出兩個“ - ”符號
第二次進入for循環,經過fork函數,第一次循環中產生的兩個進程分別再次分裂,這時會有4個進程打印 “-”符號,
所以最終結果是6個。


第21題:


 21、以下說法不正確的是()   

A、進程調度中"可搶占"和"非搶占"兩種方式,后者引起系統的開銷更大

B、每個進程都有自己的文件描述符表,所有進程共享同一打開文件表和v-node表

C、基本的存儲技術包括RAM,ROM,磁盤以及SSD,其中訪問速度最慢的是磁盤,CPU的高速緩存一般是由RAM組成的

D、多個進程競爭源出現了循環等待可能造成系統死鎖



 21、A

搶占式會引起系統的開銷更大。

可搶占式調度是嚴格保證任何時刻,讓具有最高優先數(權)的進程占有處理機運行,因此增加了處理機調度的時機,引起為退出處理機的進程保留現場,為占有處理機的進程恢復現場等時間(和空間)開銷增大。


第22題:


 22、對于Linux說法,下列說法正確的是() 

A、線性訪問內存非法時,當前線程會進入信號處理函數

B、用mv命令移動文件時,文件的修改時間會發生變化

C、ulimit -c設置的是函數調用棧的大小

D、malloc函數是應用程序向操作系統申請內存的接口



 22、A

B:不會變化

C:ulimit用于shell啟動進程所占用的資源.-c size:設置core文件的最大值.單位:blocks

D:malloc的全稱是memory allocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。


第23題:


 23、X86體系結構在保護模式下中有三種地址,請問一下那種說法是正確的?      

A、虛擬地址先經過分段機制映射到線性地址,然后線性地址通過分頁機制映射到物理地址

B、線性地址先經過分段機制映射到虛擬地址,然后虛擬地址通過分頁機制映射到物理地址

C、虛擬地址先經過分頁機制映射到線性地址,然后線性地址通過分段機制映射到物理地址

D、線性地址先經過分頁機制映射到虛擬地址,然后虛擬地址通過分段機制映射到物理地址



 23、A        

分段機制就是把虛擬地址空間中的虛擬內存組織成一些長度可變的稱為段的內存塊單元

分頁機制把線性地址空間和物理地址空間分別劃分為大小相同的塊。這樣的塊稱之為頁。通過在線性地址空間的頁與物理地址空間的頁之間建立的映射,分頁機制實現線性地址到物理地址的轉換


第24題:


24、當需要對文件進行隨機存取時,下列哪一種文件物理結構不適用于上述應用場景?        

A、順序文件

B、索引文件

C、鏈接文件

D、Hash文件



24、C    

鏈式存儲只能順序訪問,不能隨機訪問。如果要隨機訪問的話只能順序查找,效率低下


第25題:


 25、

#include<iostream>

using namespace std;

class MyClass

{

public:

    MyClass(int i = 0)

    {

        cout << i;

    }

    MyClass(const MyClass &x)

    {

        cout << 2;

    }

    MyClass &operator=(const MyClass &x)

    {

        cout << 3;

        return *this;

    }

    ~MyClass()

    {

        cout << 4;

    }

};

int main()

{

    MyClass obj1(1), obj2(2);

    MyClass obj3 = obj1;

    return 0;

}

運行時的輸出結果是()  

A、11214444

B、11314444

C、122444

D、123444



 25、C 
解釋:
首先程序中存在三個MyClass對象。
前兩個對象構造時分別輸出1,2
第三個對象是這樣構造的MyClass obj3 = obj1;這里會調用拷貝構造函數,輸出2
然后三個對象依次析構,輸出444
所以最終輸出122444


第26題:


 26、在一個64位的操作系統中定義如下結構體:

struct st_task

{

    uint16_t id;

    uint32_t value;

    uint64_t timestamp;

};

同時定義fool函數如下:

void fool()

{

    st_task task = {};

    uint64_t a = 0x00010001;

    memcpy(&task, &a, sizeof(uint64_t));

    printf("%11u,%11u,%11u", task.id, task.value, task.timestamp);

}

上述fool()程序的執行結果為()

A、1,0,0

B、1,1,0

C、0,1,1

D、0,0,1



 26、A

根據4字節對齊原則,id占用4字節,value占用4字節,timestamp占用8字節

a高位補0則為 0x 0000 0000 0001 0001

復制給結構體時:

低位4個字節復制到id --> id為1

高為4個字節復制到value --> value為0

timestamp不改變

如果8字節對齊,那么就更容易了,直接a覆蓋到id上,答案還是A


第27題:


 27、下面代碼會輸出什么()

int main(int argc, char **argv)

{

    int a[4] = {1, 2, 3, 4};

    int *ptr = (int *)(&a + 1);

    printf("%d", *(ptr - 1));

}

A、1

B、2

C、3

D、4



 27、D

&a是數組指針,其類型為int(*)[4];  
而指針加1要根據指針類型加上一定的值,不同類型的指針+1之后增加的大小不同,a是長度為4的int數組指針,所以要加5*sizeof(int),所以ptr實際是a[4],但是ptr與(&a+1)類型是不一樣的,這點非常重要,所以ptr-1只會減去sizeof(int*),a,&a的地址是一樣的,但意思就不一樣了,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[4]


第28題:


 28、

int fun(int a)

{

    a = (1 << 5) - 1;

    return a;

}

Fun(21)結果是()   

A、10

B、8

C、5

D、31



 28、D

1<<5,這里1左移5位相當于1乘以2的5次方,也就是32


第29題:


 29、下面哪一個是sort的template的正確寫法     

A、void sort(class A first,class A last,class B pred)

B、void template(class A,class B)sort(A first,A last,B pred)

C、template<class A><class B> void sort(A first,A last,B pred)

D、template<class A,class B> void sort(A first,A last,B pred)



 29、D
模板函數格式是先聲明模板類型,然后才能使用
格式是 template<class T1, class T2, ...> 返回值 函數名(參數列表)


第30題:


 30、在c++中,

const int i = 0; 

int *j = (int *) &i; 

*j = 1; 

printf("%d,%d", i, *j)

輸出是多少?

A、0,1

B、1,1

C、1,0

D、0,0



 30、A

const修飾的常量值具有不可變性,c++編譯器通常會對該變量做優化處理,在編譯時變量i的值為已知的,編譯器直接將printf輸出的變量i替換為0。盡管如此,編譯器仍然會為變量i分配存儲空間,通過修改內存的hack方式將變量i在內存中的值修改后并不影響printf的輸出。
如果將i更改為volatile const int類型的,編譯器就不會對變量i做優化,printf輸出的結果就為1。


第31題:


 31、如下代碼輸出結果是什么?

#include<stdio.h>

char *myString()

{

    char buffer[6] = {0};

    char *s = "Hello World!";

    for (int i = 0; i < sizeof(buffer) - 1; i++)

    {

        buffer[i] = *(s + i);

    }

    return buffer;

}

int main(int argc, char **argv)

{

    printf("%s\n", myString());

    return 0;

}

A、Hello

B、Hello World!

C、Well

D、以上全部不正確



 31、D

函數char *myString()中沒有使用new或者malloc分配內存,所有buffer數組的內存區域在棧區

隨著char *myString()的結束,棧區內存釋放,字符數組也就不存在了,所以會產生野指針,輸出結果未知  


第32題:


 32、不能把字符串"HELLO!"賦給數組b的語句是()

A、char b[10]={'H','E','L','L','O','!','\0'};

B、char b[10];b="HELLO!";

C、char b[10]:strcpy(b,"HELLO!");

D、char b[10]="HELLO!";



 32、B
選項B并沒有將數組b賦值為 hello! 因子b是數組的首地址,b="HELLO!";是改變了這個指針的指向,是錯誤的。


第33題:


33、

struct Date

{

    char a;

    int b;

    int64_t c;

    char d;

};

Date data[2][10];

在32位系統上,如果Data的地址是x,那么data[1][5].c的地址是()   

A、X+195

B、X+365

C、X+368

D、X+215



33、C

結構體成員地址對齊

a               b  c  d

1+(3)+4+8+1+(7)= 24,()內表示為了滿足對齊填充的大小。

&data[1][5].c = x+10*24+5*25+1+(3)+4=368。 


第34題:


 34、如何定義一個int類型的指針數組,數組元素個數為10個:      

A、int a[10];

B、int (*a)[10];

C、int *a[10];

D、int (*a[10])(int);



 34、C
“[]”的優先級比“*”要高。
B中,“()”的優先級比“[]”高,“*”號和a構成一個指針的定義,指針變量名為a,int   修飾的是數組的內容,即數組的每個元素。數組在這里并沒有名字,是個匿名數組。那現在我們清楚a 是一個指針,它指向一個包含10 個int 類型數據的數組,即數組指針
C中,a先與“[]”結合,構成一個數組的定義,數組名為a,int  *修飾的是數組的內容,即數組的每個元素。那現在我們清楚,這是一個數組,其包含10 個指向int 類型數據的指針,即指針數組。


第35題:


 35、將一顆有100個結點的完全二叉樹從根這一層開始,進行廣度遍歷編號,那么編號最小的葉節點的編號是()

A、49

B、50

C、51

D、52



 35、C
100個結點的完全二叉樹,度為0的結點比度為2的結點多一個。所以度為2的結點有49個,度為1的結點有1個,度為0的結點有50個
二叉樹前k層最多有2^k-1個結點。所以100個結點二叉樹高度為7,如果按照題目中深度遍歷,編號最小的葉子結點為7,所以題目說錯了
按照廣度遍歷編號,有50個非葉子結點,所以最小的葉子結點編號為51


第36題:


 36、解析XML時,需要校驗節點是否閉合,如必須有與之對應,用()數據結構實現比較好   

A、鏈表

B、樹

C、隊列

D、棧



 36、D

棧是解決封閉對應問題的有效方法。

比如在解析XML中,遇到一個<demo>標簽(左標簽)就入棧,遇到其子標簽的左標簽(如<subdemo>)同樣入棧。遇到右標簽(如</subdemo>或</demo>)就校驗棧頂標簽是否與該右標簽對應,能對應就出棧,不能對應則說明標簽不對稱,是無效的XML文件


第37題:


 37、快速排序算法在序列已經有序的情況下的復雜度為()           

A、O(nlogn)

B、O(n^2)

C、O(n)

D、O(n^2  logn)



 37、B
快排在完全無序的情況下效果最好,時間復雜度為O(nlogn),在有序情況下效果最差,時間復雜度為O(n^2)


第38題:


 38、無向圖G=(V E),其中V={a,b,c,d,e,f},E={<a,b>,<a,e>,<a,c>,<b,e>,<c,f>,<f,d>},<e,d>,對該圖進行深度優先排序,得到的頂點序列正確的是()

A、a,b,e,c,d,f

B、a,c,f,e,b,d

C、a,e,b,c,f,d

D、a,e,d,f,c,b



 38、D

如果有<e,d>這條邊就選擇d,否則選c


第39題:


 二、解答題

39、在寫一個函數,根據兩文件的絕對路徑算出相對路徑。如 a="/qihoo/app/a/b/c/d/new.c",b="/qihoo/app/1/2/test.c',那么b相對于a的相對路徑是"../../../../1/2/test.c"



 39、

public class PathCal {

 

 public static void main(String[] args) throws Exception {   

   

     String pathA = "/qihoo/app/a/b/c/d/new.c";  

     String pathB = "/qihoo/app/1/2/test.c";  

     System.out.println(pathRelative(pathB,pathA,""));  

 }   

   

 /** 

  * pathA相對于pathB的相對路徑 遞歸算法: 

  */  

 public static String pathRelative(String pathA,String pathB, String tempPath) {  

     if (pathA.startsWith(pathB))  

         return pathA.replaceFirst(pathB+"/",tempPath.substring(0,tempPath.length()-3));  

     else  

         return pathRelative(pathA, pathB.substring(0, pathB.lastIndexOf("/")), "../" + tempPath);  

 }  

 

}


關聯標簽:
5544444