it筆試題目
it行業是信息技術產業,也是現代熱門求職行業。it的筆試題目有哪些呢?
it筆試題目(1)
1、有一個名人和很多平民在一塊,平民都認識這個名人,但是這個名人不認識任何一個平民,任意兩個平民之間是否認識是未知的,請設計一個算法,快速找個這個人中的那個名人。 已知已經實現了一個函數 bool know(int a,int b) 這個函數返回true的時候,表明a認識b,返回false的時候表明a不認識b。
思路:首先將n個人分為n/2組,每一組有2個人,然后每個組的兩個人調用這個know函數,假設為know(a,b),返回true的時候說明a認識b,則a肯定不是名人,a可以排除掉了,依次類推,每個組都調用這個函數依次,那么n個人中就有n/2個人被排除掉了,數據規模將為n/2。同理在剩下的n/2個人中在使用這個方法,那么規模就會將為n/4,這樣所有的遍歷次數為n/2+n/4+n/8+........ 這個一個等比數列,時間復雜度為o(n)。
2、進程切換需要注意哪些問題?
保存處理器PC寄存器的值到被中止進程的私有堆棧; 保存處理器PSW寄存器的值到被中止進程的私有堆棧; 保存處理器SP寄存器的值到被中止進程的進程控制塊;
保存處理器其他寄存器的值到被中止進程的私有堆棧; 自待運行進程的進程控制塊取SP值并存入處理器的寄存器SP; 自待運行進程的私有堆棧恢復處理器各寄存器的值;
自待運行進程的私有堆棧中彈出PSW值并送入處理器的PSW; 自待運行進程的私有堆棧中彈出PC值并送入處理器的PC。
3、輸入一個升序數組,然后在數組中快速尋找兩個數字,其和等于一個給定的值。
這個編程之美上面有這個題目的,很簡單的,用兩個指針一個指向數組前面,一個指向數組的后面,遍歷一遍就可以了。
4、判斷一個自然數是否是某個數的平方。當然不能使用開方運算。
方法1:
遍歷從1到N的數字,求取平方并和N進行比較。
如果平方小于N,則繼續遍歷;如果等于N,則成功退出;如果大于N,則失敗退出。
復雜度為O(n^0.5)。
方法2:
使用二分查找法,對1到N之間的數字進行判斷。
復雜度為O(log n)。
方法3:
由于
(n+1)^2
=n^2 + 2n + 1,
= ...
= 1 + (2*1 + 1) + (2*2 + 1) + ... + (2*n + 1)
注意到這些項構成了等差數列(每項之間相差2)。
所以我們可以比較 N-1, N - 1 - 3, N - 1 - 3 - 5 ... 和0的關系。
如果大于0,則繼續減;如果等于0,則成功退出;如果小于 0,則失敗退出。
復雜度為O(n^0.5)。不過方法3中利用加減法替換掉了方法1中的乘法,所以速度會更快些。
例如:3^2 = 9 = 1 + 2*1+1 + 2*2+1 = 1 + 3 + 5
4^2 = 16 = 1 + 2*1 + 1 + 2*2+1 + 2*3+1
int square(int n)
{
int i = 1;
n = n - i;
while( n > 0 )
{
i += 2;
n -= i;
}
if( n == 0 ) //是某個數的平方
return 1;
else //不是某個數的平方
return 0;
}
it筆試題目(2)
一、算法設計
1、設rand(s,t)返回[s,t]之間的隨機小數,利用該函數在一個半徑為R的圓內找隨機n個點,并給出時間復雜度分析。
思路:這個使用數學中的極坐標來解決,先調用[s1,t1]隨機產生一個數r,歸一化后乘以半徑,得到R*(r-s1)/(t1-s1),然后在調用[s2,t2]隨機產生一個數a,歸一化后得到角度:360*(a-s2)/(t2-s2)
2、為分析用戶行為,系統常需存儲用戶的一些query,但因query非常多,故系統不能全存,設系統每天只存m個query,現設計一個算法,對用戶請求的query進行隨機選擇m個,請給一個方案,使得每個query被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用戶的總請求量。
思路:如果用戶查詢的數量小于m,那么直接就存起來。如果用戶查詢的數量大于m,假設為m+i,那么在1-----m+i之間隨機產生一個數,如果選擇的是前面m條查詢進行存取,那么概率為m/(m+i),如果選擇的是后面i條記錄中的查詢,那么用這個記錄來替換前面m條查詢記錄的概率為m/(m+i)*(1-1/m)=(m-1)/(m+i),當查詢記錄量很大的時候,m/(m+i)== (m-1)/(m+i),所以每個query被抽中的概率是相等的。
3、C++ STL中vector的相關問題:
(1)、調用push_back時,其內部的內存分配是如何進行的?
(2)、調用clear時,內部是如何具體實現的?若想將其內存釋放,該如何操作?
vector的工作原理是系統預先分配一塊CAPACITY大小的空間,當插入的數據超過這個空間的時候,這塊空間會讓某種方式擴展,但是你刪除數據的時候,它卻不會縮小。
vector為了防止大量分配連續內存的開銷,保持一塊默認的尺寸的內存,clear只是清數據了,未清內存,因為vector的capacity容量未變化,系統維護一個的默認值。
有什么方法可以釋放掉vector中占用的全部內存呢?
標準的解決方法如下
template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}
事實上,vector根本就不管內存,它只是負責向內存管理框架acquire/release內存,內存管理框架如果發現內存不夠了,就malloc,但是當vector釋放資源的時候(比如destruct), stl根本就不調用free以減少內存,因為內存分配在stl的底層:stl假定如果你需要更多的資源就代表你以后也可能需要這么多資源(你的list, hashmap也是用這些內存),所以就沒必要不停地malloc/free。如果是這個邏輯的話這可能是個trade-off
一般的STL內存管理器allocator都是用內存池來管理內存的,所以某個容器申請內存或釋放內存都只是影響到內存池的剩余內存量,而不是真的把內存歸還給系統。這樣做一是為了避免內存碎片,二是提高了內存申請和釋放的效率——不用每次都在系統內存里尋找一番。
二、系統設計
正常用戶端每分鐘最多發一個請求至服務端,服務端需做一個異?蛻舳诵袨榈倪^濾系統,設服務器在某一刻收到客戶端A的一個請求,則1分鐘內的客戶端任何其它請求都需要被過濾,現知每一客戶端都有一個IPv6地址可作為其ID,客戶端個數太多,以至于無法全部放到單臺服務器的內存hash表中,現需簡單設計一個系統,使用支持高效的過濾,可使用多臺機器,但要求使用的機器越少越好,請將關鍵的設計和思想用圖表和代碼表現出來。
三、求一個全排列函數:
如p([1,2,3])輸出:
[123]、[132]、[213]、[231]、[321]、[323]
求一個組合函數
如p([1,2,3])輸出:
[1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3]
這兩問可以用偽代碼。
it筆試題目(3)
1、對于一個內存地址是32位、內存頁是8KB的系統。0X0005F123這個地址的頁號與頁內偏移分別是多少。
2、如果X大于0并小于65536,用移位法計算X乘以255的值為: (X<<8)-X
X<<8-X是不對的,因為移位運算符的優先級沒有減號的優先級高,首先計算8-X為0,X左移0位還是8。
3、一個包含n個節點的四叉樹,每個節點都有四個指向孩子節點的指針,這4n個指針中有 3n+1 個空指針。
4、以下兩個語句的區別是:第一個動態申請的空間里面的值是隨機值,第二個進行了初始化,里面的值為0
int *p1 = new int[10];
int *p2 = new int[10]();
5、計算機在內存中存儲數據時使用了大、小端模式,請分別寫出A=0X123456在不同情況下的首字節是,大端模式:0X12 小端模式:0X56 X86結構的計算機使用 小端 模式。
一般來說,大部分用戶的操作系統(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。
6、在游戲設計中,經常會根據不同的游戲狀態調用不同的函數,我們可以通過函數指針來實現這一功能,請聲明一個參數為int *,返回值為int的函數指針:
int (*fun)(int *)
7、下面程序運行后的結果為:to test something
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = static_cast(p);
p1++;
p = static_cast(p1);
printf("result is %s\n",p);
8、在一冒險游戲里,你見到一個寶箱,身上有N把鑰匙,其中一把可以打開寶箱,假如沒有任何提示,隨機嘗試,問:
(1)恰好第K次(1=
(2)平均需要嘗試多少次。
這個就是求期望值 由于每次打開寶箱的概率都是1/n,則期望值為: 1*(1/n)+2*(1/n)+3*(1/n)+......+n*(1/n) = (n+1)/2
it筆試題目(4)
1、對于如下程序:
#include
using namespace std;
class A
{
public:
A()
{
cout<<"A"<
}
};
int main(void)
{
A a[4], b,*p;
}
會輸出多少個A?( C )
A、2 B、3 C、5 D、6
p只是一個對象指針,并沒有指向一個對象的內存空間,所以沒有調用構造函數。
2、頭文件中的 ifndef/define/endif 有什么作用?
答:防止該頭文件被重復引用,避免變量、類型等被重新定義。
3、const 有什么用途?(請至少說明兩種)
答:(1)可以定義 const 常量。
(2)const可以修飾函數的參數、返回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。
4、如下的字符串函數,用于生存一個字符串 ”連接號碼異常” ,并返回它的指針
char* strfun()
{
char str[20];
strcpy(str, “連接號碼異常”);
printf(“%s \n”, str); //printf語句1
return str;
}
void main()
{
char *pstr = strfun();
printf("%s \n", pstr); //printf語句2
}
問題1 : printf語句1和printf語句2哪個能在屏幕上正在打印出來?
問題2 : 如果不能正常在屏幕上打印出字符串,請說明原因。
問題3 : 如果不修改strfun的聲明,請問該如何修改上述程序的錯誤。
答:
問題1:語句1可以正常打印,語句2不能正常打印;
問題2:語句2使用的指針所指向的內存空間str[20],在函數strfun返回時已經被釋放了;
問題3:可以將函數strfun中的語句char str[20];改為char *str = new char[20];
5、下面是交換兩個double型數據的函數,
void swap( double* p1, double* p2 )
{
double *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
void main()
{
double a = 0.1;
double b = 0.2;
swap( &a, &b );
}
請找出上述代碼的錯誤,指出錯誤的原因,并改正。
答:函數swap中混淆了double型指針與double型變量的差別,對于一個未初始化的指針訪問其內存空間是非常危險的。對swap函數修改如下:
void swap( double* p1, double* p2 )
{
double p;
p = *p1;
*p1 = *p2;
*p2 =p;
}
6、在電信業務的后臺處理程序中,經常會涉及到處理字符串,除了用char *處理字符串之外,C++還為我們提供了封裝了的字符串類string,其本質也是用一個動態數組來保存字符串,類String的原型為:
class String
{
public:
String(const char *str = NULL); // 普通構造函數
String(const String &other); // 拷貝構造函數
~String(void); // 析構函數
String & operate =(const String &other); // 賦值函數
private:
char *m_data; // 用于保存字符串
};
請編寫String的上述4個函數普通構造函數、拷貝構造函數、析構函數和賦值函數。
代碼如下:
class String
{
private:
char *m_data;
public:
String();
String(const char *str = NULL);
String(const String &other);
~String(void);
String & operator =(const String &other);
};
String::String()
{
m_data = NULL;
}
String::String(const char *str = NULL) //帶一個指針的普通構造函數
{
if(str == NULL)
{
m_data = new char[1];
assert(m_data != NULL);
*m_data = '\0';
}
else
{
int length=strlen(str);
m_data = new char[length+1];
assert(m_data != NULL);
strcpy(m_data,str);
}
}
String::String(const String &other) //拷貝構造函數
{
m_data = new char[other.length+1];
assert(m_data != NULL);
strcpy((*this).m_data,other.m_data);
}
String::~String(void) //析構函數
{
if(m_data != NULL)
{
delete m_data;
m_data = NULL;
}
}
String & String::operator=(const String &other) //賦值函數
{
if(&other != this)
{
delete [](*this).m_data;
(*this).m_data = new char[other.length+1];
assert((*this).m_data != NULL);
strcpy((*this).m_data,other.m_data);
}
}
【it筆試題目】相關文章:
比亞迪筆試題目09-24
沃爾瑪筆試題目08-25
社聯筆試題目11-02
盛大筆試題目06-10
日立電梯筆試題目08-03
常見軟件筆試題目05-03
文員必考的筆試題目05-27
文秘筆試題目及答案07-20
京東應聘筆試題目06-05
網易java筆試題目07-24