1. 求重合段的長度
size_t foo(unsigned int *a1, size_t al1, unsigned int* a2, size_t al2)
其中a1和a2都為無符號陣列,al1和al2為陣列的長度,陣列的長度為偶數。
無符號陣列由一對數字區間組成。如下例:
a1 為 0,1,3,6,10,20
a2 為 0,1,20,50,4,5
則 a1表示以下區間[0,1] [3,6] [10,20]
a2表示以下區間[0,1] [20,50] [4,5]
則a1,a2的重疊部分為[0,1] [4,5],其長度為2,函式foo要求返回重疊區間的長度。上例中為2。
要求:詳細說明自己的解題思路,說明自己實現的一些關鍵點。
寫出函式foo原**,另外效率盡量高,並給出**的複雜性分析。
限制:al1和al2的長度不超過100萬。而且同乙個陣列的區間可能出現重重疊。
如a1可能為 0,5, 4,8, 9,100, 70,80
使用的儲存空間盡量小。
#include #include using namespace std;
class data
;inline bool operator<( const data & d1, const data& d2)
int foo(unsigned int *a1, int al1, unsigned int* a2, int al2)
else if(d1[i].first >= d2[j].second)
else
else if(d2[j].first <= d1[i].first && d2[j].second >= d1[i].second)
else if( d1[i].first >= d2[j].first && d1[i].first < d2[j].second && d1[i].second >= d2[j].second)
else if( d2[j].first >= d1[i].first && d2[j].first < d1[i].second && d2[j].second >= d1[i].second)}}
return len;
}int main()
; unsigned int a2 = ;
int len = foo( a1, 6, a2, 6);
cout << "len: " << len << endl;
return 0;
}
2. 多人排成乙個佇列,我們認為從低到高是正確的序列,但是總有部分人不遵守秩序。如果說,前面的人比後面的人高(兩人身高一樣認為是合適的)
那麼我們就認為這兩個人是一對「搗亂分子」,
比如說,現在存在乙個序列:
176, 178, 180, 170, 171
這些搗亂分子對為 <176, 170>,<176, 171>,<178, 170>,<178, 171>,<180, 170>,<180, 171>
那麼,現在給出乙個整型序列,請找出這些搗亂分子對的個數(僅給出搗亂分子對的數目即可,不用具體的對)
要求:輸入:
為乙個檔案(in),檔案的每一行為乙個序列。序列全為數字,數字間用」,」分隔。
輸出:為乙個檔案(out),每行為乙個數字,表示搗亂分子的對數。
詳細說明自己的解題思路,說明自己實現的一些關鍵點。並給出實現的** ,並分析時間複雜度。
限制:輸入每行的最大數字個數為100000個,數字最長為6位。程式無記憶體使用限制。
歸併的方法求陣列的逆序數。
#include using namespace std ;
void merge(int * a, int *p, int start, int mid, int end, int & count)
else
}while(i <= mid)
while(j <= end) }
void mergesort(int *a, int *p, int start, int end, int &count)
}int main()
cout << endl;
mergesort( a, p, 0, n - 1, count);
cout << count << endl;
}delete p;
return 0;
}
3. 合併有序陣列的前後段
陣列al[0,mid-1] 和 al[mid,num-1],都分別有序。將其merge成有序陣列al[0,num-1],要求空間複雜度o(1)
思路:就是將前半段比後半段大的元素,在後半段進行插入排序(從前向後插入,而不是從後往前),此處注意乙個問題,在拿前面元素向後半段插入時,後半段肯定有空間可用,因為已經將它的乙個元素放入了前半段有序陣列中。
#include using namespace std ;
void merge(int a, int len)
else
else
a[index-1] = tmp;
}}// end of else
}// end of for
}int main()
; for( int i = 0; i < 10; i++)
cout << endl;
merge(a, 10);
for( int i = 0; i < 10; i++)
cout << endl;
return 0;
}
4. 隨機輸入乙個數,判斷它是不是對稱數(回文數)(如3,121,12321,45254)。不能用字串庫函式
思路: 首先將數字轉化為字串(由於只是判斷是否是回文數,因此轉化為字串之後的正序逆序並不重要),然後判斷字串是否是對稱的。
#include using namespace std ;
bool issymmetry(char * str)
else
}return true;
}void int2str(int n, char * str)
int index = 0;
while(n > 0)
return ;
}int main()
else
return 0;
}
5. a,b,c,d 四個程序,a 向 buf 裡面寫資料,b,c,d 向 buf 裡面讀資料,當 a 寫完,且b ,c ,d都讀一次後,a 才能再寫。用pv操作實現。
解答:乙個生產者,三個消費者,公用 1 個緩衝區
在這個問題中,不僅生產者與消費者之間要同步,同時每生產乙個產品,三個消費者必須並且只能消費一次。
定義四個訊號量:
mutexb—— 消費者 b 和生產者之間的互斥訊號量,初值為 1 。
mutexc—— 消費者 c 和生產者之間的互斥訊號量,初值為 1 。
mutexd—— 消費者 d 和生產者之間的互斥訊號量,初值為 1 。
// 生產者程序
while(true)
// 消費者程序 b ,每個產品,該消費者只能消費一次while(true)// 消費者程序 c ,每個產品,該消費者只能消費一次while(true)// 消費者程序 d, 每個產品,該消費者只能消費一次while(true)
by andy @ 2013-9-28
微軟筆試面試題目
智力題 1 燒一根不均勻的繩子,從頭燒到尾總共需要1個小時,問如何用燒繩子的方法來確定半小時的時間呢?2 10個海盜搶到了100顆寶石,每一顆都一樣大小且價值連城。他們決定這麼分 1 抽籤決定自己的號碼 1 10 2 首先,由1號提出分配方案,然後大家表決,當且僅當超過半數的人同意時,按照他的方案進...
筆試面試題目8
1.寫乙個 string類,以及建構函式能是虛函式嗎?class string string char str null 建構函式 string int len,char ch string 析構函式 string string str 複製建構函式 int size 獲得字串長度 string o...
XX筆試面試題目
瀏覽器預設字型大小是16px 事件繫結addeeventlistener和普通繫結on的區別 把url的引數轉換成json物件 json物件和字串的相互轉換 事件委託的理解?canvas 判斷 不是非替換元素?能做動畫,也能響應事件?匹配div不含子元素 選項 div not null no emp...