迅雷 2021 C++工程師面試題
小編:管理員 896閱讀 2021.09.30
?一、單選題
下列表達式正確的是:
A? 9++
B? (x+y)++
C? c+++c+++c++
D? ++(a-b--)
?C
選擇c,因為9是一個(gè)常量,常量不能自增自減,而( x+y )和下面的( a -b )都是作為一種只讀內存區存在的,所以都不能進(jìn)行自增自減操作。題目其實(shí)不嚴謹,c中c如果作為一個(gè)變量那么是正確的,但是如果c的類(lèi)型是數組也不正確。
第2題:
在int?b[?][3]?=?{{1},{3,2},{4,5,6},{0}};中,sizeof(b)?= ?
A? 4
B? 12
C? 28
D? 48
?D
解釋?zhuān)?
b為4行3列的二維數組,12*4 = 48
第3題:
以下程序的輸出結果是:
#define?M(x,y,z)?x*y+z
main()
{
???????int?a=1,?b=2,?c=3;
???????printf("%d/n",M(a+b,b+c,c+a));
}
A? 19
B? 17
C? 15
D? 12
?D
分析:#define的邊際效應,直接展開(kāi),變成a+b*b+c+c+a,詳見(jiàn)找工作筆試面試那些事兒(1)---C,C++基礎和編程風(fēng)格(2)
第4題:
若有以下定義和語(yǔ)句:
int u=010, v= 0x10, w=10;
printf(“%d,%d,%d/n”,u,v,w);
??
則輸出結果是:
??
A? 8,16,10
B? 10,10,10
C? 8,8,10
D? 8,10,10
?A
010是表示八進(jìn)制,0x表示16進(jìn),10就不用說(shuō)了
第5題:
下面程序段的輸出結果是:
int?a=5,?b=4,?c=3,?d=2;
if(a>b>c)
???????printf(“%d/n”,d);
else?if((c-1>=d)==1)
???????printf(“%d/n”,?d+1);
else
???????printf(“%d/n”,?d+1);
? ?????
A? 2
B? 3
C? 4
D? 編譯錯誤
?B
a>b>c求的是一個(gè)邏輯值,正確為1,錯誤為0,a=5,b=4,c=3,首先a>b成立,邏輯值為1,而1小于2,故不輸出2;
+或者-的優(yōu)先級高于>=;所以c-1>=d先減再判斷,成立,為邏輯值1;()優(yōu)先級大于比較==,因為1=1,所以輸出d+1;為3
第6題:
有如下程序段,請問(wèn)k的值是
enum {
????a, b=5, c, d=4, e
} k;
k =c;
?? ????
A? 3
B? 4
C? 5
D? 6
?D
enum中:首元素不賦值的話(huà),默認為0;后一個(gè)元素不賦值的話(huà)比前一個(gè)元素大1
第7題:
有如下程序段:
int i, n = 0;
float x = 1, y1 = 2.1 / 1.9, y2 = 1.9 / 2.1;
for ( i = 1; i < 22; i++ )
?x = x * y1;
while ( x != 1.0 )
{
?x = x * y2; n++;
}
printf( “ %d / n ”, n );
? ?
請問(wèn)執行結果是:
?????
A? 21
B? 22
C? 無(wú)限循環(huán)
D? 程序崩潰
?C
分析:浮點(diǎn)數的比較不可以用 = = 或者 != ,詳見(jiàn)找工作筆試面試那些事兒(1)---C,C++基礎和編程風(fēng)格(2)?,會(huì )一直循環(huán)下去,選擇C
第8題:
用樹(shù)形結構表示實(shí)體之間聯(lián)系的模型是
A? 關(guān)系模型
B? 網(wǎng)狀模型
C? 層次模型
D? 以上三個(gè)都是
?C
層次模型是用樹(shù)型結構記錄的。樹(shù)中每一個(gè)節點(diǎn)代表一個(gè)記錄類(lèi)型,樹(shù)狀結構表示實(shí)體型之間的聯(lián)系
?
第9題:
有如下程序段:
char?fun(char?*);
main()
{
???????char?*s?=?“one”,?a[5]?=?{0},?(*f1)(char?*)?=?fun,?ch;
}
???
則對函數fun的調用語(yǔ)句正確的是
?
A? *f1(&a);
B? f1(*s);
C??f1(&ch)
D? ch?=?*f1(s);要改成(*f1)(s)才正確
?C
第10題:
有如下程序段:
int?c?=?23;
printf(“%d\n”,?c&c);
??
請問(wèn)執行結果是:
??
A? 0
B? 46
C? 23
D? 以上都不對
?C
?printf輸出的結果是將c&c后的結果,&是位運算符,將前后兩個(gè)操作數對應為相與。而任何數與其自身相與,得到的結果不變 ? 1&1=1 ? 0&0=0
所以c&c 等于 c 等于 23
所以,輸出結果 23
PS: printf這行代碼有誤?? 應該為:printf("%d\n", c&c);
第11題:
?二、不定項選擇
下面屬于構造散列函數的方法是()
?????????
A? 直接定址法
B? 數字分析法
C? 乘余取整法
D? 平方取中法
?A B C D
直接定址法、數字分析法、折疊法 、平方取中法、減去法、基數轉換法 、除留余數法、隨機乘數法、字符串數值哈希法、旋轉法 ?、偽隨機數法?
第12題:
拷貝構造函數的特點(diǎn)是()?
A? 該函數名同類(lèi)名,也是一種構造函數,該函數返回自身引用
B? 該函數只有一個(gè)參數,必須是對某個(gè)對象的引用
C? 每個(gè)類(lèi)都必須有一個(gè)拷貝初始化構造函數,如果類(lèi)中沒(méi)有說(shuō)明拷貝構造函數,則編譯器系統會(huì )自動(dòng)生成一個(gè)缺省拷貝構造函數,作為該類(lèi)的保護成員
D? 拷貝初始化構造函數的作用是將一個(gè)已知對象的數據成員值拷貝給正在創(chuàng )建的另一個(gè)同類(lèi)的對象
?D
拷貝函數和構造函數沒(méi)有返回值,A錯;
拷貝構造函數的參數可以使一個(gè)或多個(gè),但左起第一個(gè)必須是類(lèi)的引用對象,B錯;
若類(lèi)定義中沒(méi)有聲明拷貝構造函數,則編譯器會(huì )自動(dòng)生成一個(gè)缺省的拷貝構造函數,但是不會(huì )是該類(lèi)的保護成員,C錯;
通過(guò)拷貝函數可以將另一個(gè)對象作為對象的初值,D對
第13題:
下列關(guān)于虛函數的說(shuō)法正確的是()? ? ??
A? 在構造函數中調用類(lèi)自己的虛函數,虛函數的動(dòng)態(tài)綁定機制還會(huì )生效
B? 在析構函數中調用類(lèi)自己的虛函數,虛函數的動(dòng)態(tài)綁定機制還會(huì )生效
C? 靜態(tài)函數不可以是虛函數
D? 虛函數可以聲明為inline
?C D
由于類(lèi)的構造次序是由基類(lèi)到派生類(lèi),所以在構造函數中調用虛函數,這個(gè)虛函數不會(huì )呈現出多態(tài); 相反,類(lèi)的析構是從派生類(lèi)到基類(lèi),當調用繼承層次中某一層次的類(lèi)的析構函數時(shí)往往意味著(zhù)其派生類(lèi)部分已經(jīng)析構掉,所以也不會(huì )呈現出多態(tài)
第14題:
下列對函數double add(int a , int b)進(jìn)行重載,正確的是()? ? ??
A? int add(int a ,int b ,int c)
B? int add(double a , double b)
C? double add(double a , double b)
D? int add(int a , int b)
?A B C
在C++中,函數的重載取決于函數的特征標即函數的參數列表。同名的函數,特征標不一樣則函數不一樣,A、B、C 的參數列表與題目給出的特征標數量或類(lèi)型不一樣,因此正確答案為A、B、C
第15題:
下面關(guān)于數組的描述錯誤的是:? ? ?
A? 在C++語(yǔ)言中數組的名字就是指向該數組第一個(gè)元素的指針
B? 長(cháng)度為n的數組,下標的范圍是0-n-1
C? 數組的大小必須在編譯是確定
D? 數組只能通過(guò)值參數和引用參數兩種方式傳遞給函數
?C D
A,錯誤,原因:如果數組是一維數組,A正確。但如果是多維數組則A錯誤。
B,錯誤,當n=0時(shí)。
C,正確
D,正確,因為數組不能拷貝,所以數組做參數時(shí)只能通過(guò)值參數(指針形式),引用參數(引用形式)。
第16題:
?三、問(wèn)答題
實(shí)現strtol函數,其原型如為int strtol(const char *num_str, char **endptr, int base),num_str存放待轉換的字符串,可以是負數也可以是正數;endptr指向第一個(gè)非法字符的地址,如果endptr為null則不指向第一個(gè)非法字符的地址;base用于指示進(jìn)制,若base為0,則根據num_str的指示來(lái)轉換。函數必須檢查溢出,如果正數溢出,返回int_max;若負數溢出,返回int_min。
第17題:
?一億個(gè)數找最大的1000個(gè)數,要求效率高占用內存少。函數原型為:find_max_data(int* source_data, int* max_data),其中source_data是存放一億個(gè)數的數組,max_data用于存放其中最大的1000個(gè)數。
?
/* 基數排序 ?*/
#include
#include
#include
#include
#include
#include "windows.h"
using namespace std;
#define MAXN 100000000 #define MAXM 1000
void find_max_data0( int dest[], int m, int src[], int n )
{
??? fill( dest, dest + n, -INT_MAX );
??? for ( int i = 0; i < n; i++ )
??? {
??? ? ? for ( int j = 0; j < m; j++ )
??? ? ? {
??? ? ? ? ? if ( src[i] > dest[j] )
??? ? ? ? ? {
??? ? ? ? ? ? ? dest[j] = src[i];
??? ? ? ? ? ? ? break;
??? ? ? ? ? }
??? ? ? }
??? }
}
void find_max_data1( int dest[], int m, int src[], int n )
{
??? make_heap( src, src + n );
??? for( int i = 0; i < m; i++ )
??? {
??? ? ? dest[i] = src[0];
??? ? ? pop_heap( src, src + n-- );
??? }
}
void radix_sort( int *src, int n )
{
??? int *tmp = new int[MAXN]; ?int cnt[256];
??? for( int i = 0; i < 4; i++ ) {
??? ? ? memset( cnt, 0, sizeof(cnt) );
??? ? ? for( int j = 0; j < MAXN; j++ )
??? ? ? {
??? ? ? ? ? cnt[ ( src[j] >> (8 * i) ) & 0xff ]++;
??? ? ? }
??? ? ? for ( int j = 1; j < 256; j++ )
??? ? ? {
??? ? ? ? ? cnt[j] = cnt[j - 1] + cnt[j];
??? ? ? }
??? ? ? for( int j = MAXN - 1; j >= 0; j-- )
??? ? ? {
??? ? ? ? ? tmp[ -- cnt[ ( src[j] >> (8 * i) ) & 0xff ] ] = src[j]; swap( src, tmp );
??? ? ? }
??? }
??? delete [] tmp;
}
void find_max_data2( int dest[], int m, int src[], int n )
{
??? radix_sort( src, n );
??? int j = 0;
??? for( int i = n - 1; i >= n - m; i-- )
??? {
??? ? ? dest[j++] = src[i];
??? }
}
int src[MAXN];
int main()
{
??? ( (unsigned int) time( NULL ) );
??? src[i] = abs( i * 6516187 );
??? DWORD t1, t2;
??? t1 ?= GetTickCount();
??? find_max_data2( dest2, MAXM, src, MAXN ); ?
????t2 = GetTickCount();
??? printf( "find_max_data2 time cost:%dn", t2 - t1 );
????for( int i = 0; i < MAXM; i++ )
??? {
??? ? ? printf( "n" ); ?return 0;
??? }
}
第18題:
?將一個(gè)集合拆分成兩個(gè)不相交的子集,兩個(gè)子集元素之和相等,如{1, 2, 3, 4, 5, 6, 7},拆分成: {2, 5, 7}, {1, 3, 4, 6} 給出一個(gè)集合,求所有符合上面要求的拆分,效率最高分越高,函數原型為int cal_num(int n);
?
#include
using namespace std;
#define MAXN 100
??
void dfs(int pi,int curSum,bool res[],int n,int half,int &num,int left[])
{
??? for(int i=pi+1;i<=n;i++) {?
??? ? ? res[i]=true;?
??? ? ? if(curSum+left[i]=1;i--)
??? ? ? ? ? left[i]=i+left[i+1];?
??? dfs(0,0,res,n,half,cnt,left);
??? return cnt;
}
int main()
{
??? int n=20;
??? int num=cal_num(n);
??? printf("num=%d\n",num);
??? return 0;
}
? ?
相關(guān)推薦
- 迅雷 2021 C++工程師面試題 第1題:一、單選題下列運算符中,在C++語(yǔ)言中不能重載的是:A *B =C ::D delete C在C++中,sizeof運算符,.成員運算符,.*成員指針運算符,::作用域解析運算符以及?:條件運算符不能被重載,因此答案選C第2題:下面關(guān)于多態(tài)性的描述,錯誤的是:A C++語(yǔ)言…
- 迅雷 2021 技術(shù)類(lèi)面試題 第1題:有變量int i = 0; int a = i++; int b=++a; int c = a+b; 請問(wèn)表達式 a?b:c 的值是()A、0 B、1 C、2 D、3第2題:32位環(huán)境下,int *p=new int ;請問(wèn)sizeof(p)的值為()A、4 B、10 C、40 D、8第3題:有語(yǔ)句char str = "abcde";請問(wèn)表達式sizeo…
- 經(jīng)典筆試題-JDBC及Hibernate篇 五、JDBC 及Hibernate:(共12 題:基礎10 道,中等難度2 道)110、數據庫,比如100 用戶(hù)同時(shí)來(lái)訪(fǎng),要采取什么技術(shù)解決?【基礎】 答:可采用連接池。111、什么是ORM?【基礎】 答:對象關(guān)系映射(Object—Relational Mapping,簡(jiǎn)稱(chēng)ORM)是一種為了解決面向對象…