2011.10.17百度面试题
1、進(jìn)程切換需要注意哪些問題?
保存處理器PC寄存器的值到被中止進(jìn)程的私有堆棧;????? 保存處理器PSW寄存器的值到被中止進(jìn)程的私有堆棧;??? 保存處理器SP寄存器的值到被中止進(jìn)程的進(jìn)程控制塊;
保存處理器其他寄存器的值到被中止進(jìn)程的私有堆棧;???? 自待運行進(jìn)程的進(jìn)程控制塊取SP值并存入處理器的寄存器SP;??? 自待運行進(jìn)程的私有堆棧恢復(fù)處理器各寄存器的值;
自待運行進(jìn)程的私有堆棧中彈出PSW值并送入處理器的PSW;???? 自待運行進(jìn)程的私有堆棧中彈出PC值并送入處理器的PC。
2、輸入一個升序數(shù)組,然后在數(shù)組中快速尋找兩個數(shù)字,其和等于一個給定的值。
這個編程之美上面有這個題目的,很簡單的,用兩個指針一個指向數(shù)組前面,一個指向數(shù)組的后面,遍歷一遍就可以了。
3、有一個名人和很多平民在一塊,平民都認(rèn)識這個名人,但是這個名人不認(rèn)識任何一個平民,任意兩個平民之間是否認(rèn)識是未知的,請設(shè)計一個算法,快速找個這個人中的那個名人。? 已知已經(jīng)實現(xiàn)了一個函數(shù)? bool know(int a,int b) 這個函數(shù)返回true的時候,表明a認(rèn)識b,返回false的時候表明a不認(rèn)識b。
思路:首先將n個人分為n/2組,每一組有2個人,然后每個組的兩個人調(diào)用這個know函數(shù),假設(shè)為know(a,b),返回true的時候說明a認(rèn)識b,則a肯定不是名人,a可以排除掉了,依次類推,每個組都調(diào)用這個函數(shù)依次,那么n個人中就有n/2個人被排除掉了,數(shù)據(jù)規(guī)模將為n/2。同理在剩下的n/2個人中在使用這個方法,那么規(guī)模就會將為n/4,這樣所有的遍歷次數(shù)為n/2+n/4+n/8+........ 這個一個等比數(shù)列,時間復(fù)雜度為o(n)。
4、有一類數(shù)組,例如書序[1,2,3,4,6,8,9,4,8,11,18,19,100] 前半部分是是一個遞增數(shù)組,后面一個還是遞增數(shù)組,但整個數(shù)組不是遞增數(shù)組,那么怎么最快的找出其中一個數(shù)?
#include <iostream> using namespace std;int binary_search(int* a, int low, int high, int goal) //二分查找 {while(low <= high){int middle = (low+high)>>1; //(low+high)/2if(a[middle] == goal)return middle;//在右半邊else if(a[middle] < goal)low = middle + 1;//在左半邊elsehigh = middle - 1;}return -1; } void getNum(int *a, int len, int goal) {int i, index;for(i = 0; i < len-1; i++){if(a[i] > a[i+1]) //找到前、后兩個數(shù)組的分界點break;}if(a[i] >= goal) //對前面數(shù)組進(jìn)行二分查找{index = binary_search(a, 0, i, goal);printf("%d\n",index);}if(a[i+1] <= goal) //對后面數(shù)組進(jìn)行二分查找{index = binary_search(a+i+1, 0, len-i-2, goal);if(index != -1)index += (i+1); //后面的那個數(shù)組相對于前面數(shù)組的偏移量為i+1printf("%d\n",index);} }int main(void) {int a[]={1,2,3,4,6,8,9,4,8,11,18,19,100};int len = 13, goal = 4;getNum(a,len,goal);return 0; }5、判斷一個自然數(shù)是否是某個數(shù)的平方。當(dāng)然不能使用開方運算。
方法1:
遍歷從1到N的數(shù)字,求取平方并和N進(jìn)行比較。
如果平方小于N,則繼續(xù)遍歷;如果等于N,則成功退出;如果大于N,則失敗退出。
復(fù)雜度為O(n^0.5)。
方法2:
使用二分查找法,對1到N之間的數(shù)字進(jìn)行判斷。
復(fù)雜度為O(log n)。
方法3:
由于
(n+1)^2
=n^2 + 2n + 1,
= ...
= 1 + (2*1 + 1) + (2*2 + 1) + ... + (2*n + 1)
注意到這些項構(gòu)成了等差數(shù)列(每項之間相差2)。
所以我們可以比較 N-1, N - 1 - 3, N - 1 - 3 - 5 ... 和0的關(guān)系。
如果大于0,則繼續(xù)減;如果等于0,則成功退出;如果小于 0,則失敗退出。
復(fù)雜度為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 ) //是某個數(shù)的平方return 1;else //不是某個數(shù)的平方return 0; }?
總結(jié)
以上是生活随笔為你收集整理的2011.10.17百度面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯2011.10.15校园招聘会笔试题
- 下一篇: 浅谈函数指针