牛客網研究生機試題刷題記錄
牛客網:清華大學
1.成績排序
這題我一開始採用的是排序演算法,排序最快的時間複雜度為O(nlogn)。所以這裡換一種思路,既然有100分,不如建立一個二維vector,在每一份的vector上push上姓名,這樣時間複雜度降到O(n)。
順便複習一下排序的時間代價和分類。
時間代價表:
2.算約數的個數
思路很簡答的演算法題,但是容易用最簡單的方法,導致超時。
這裡記錄一下思路:用一個i來進行迴圈,i < sqrt(n), 如果i 最後等於 sqrt(n) 其中包含i = 1這種特殊情況,需要給計數加一下。
#include<iostream>
using namespace std;
int numOfDivisor(int num)
{
int ans = 0;
int i;
for (i = 1; i*i<num; i++)
{
if (num%i == 0)
ans += 2;
}
if (i*i == num) ans++;
return ans;
}
int main()
{
int n, num;
while (cin >> n)
{
for (int i = 0; i< n; i++)
{
cin >> num;
cout << numOfDivisor(num) << endl;
}
}
return 0;
}
3.代理伺服器
這裡遇到了menset和fill,在這裡寫一下區別。
memset只能用來填充char型陣列。
ill函式可以賦值任何,而且使用方法特別簡便。
所以決定以後就用fill。標頭檔案:。fill(arr, arr + n, 要填入的內容);
那這樣只要貪心演算法就好,每次選出能訪問最多的伺服器進行訪問,不能訪問完全時候flag為-1
4.翻轉字串
求string的實際長度 string.size()。
新建立的string預設長度為8位元組。
5.邏輯題目,寫出26個字母在每個按鍵上需要按幾次,每個字母在哪個數字鍵盤上即可。
6.我先求了質數,然後如果一個質數可以被除,就一直除。此過程中摔了手機,幸好只是膜碎了。又下單買了三張。
7.整數拆分。
這題採用類似揹包問題的解法。揹包問題總結在另一篇文章。
這裡跟完全揹包問題有一些想通,但是不需要算權值,有方法就往上加,而且使用一維陣列,要保證第一個是dp[1]是1。
牛客網:浙江大學
1.歐拉回路
歐拉回路的概念大概是:不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。
我在網上找到了充要條件:除孤立節點外,其它節點滿足 1.連通 2.度為偶數。
這裡採用並查集的思想,把線路中給出的兩個端點,都找出他們的“頂頭大哥”,方便後續操作。如果所有的點的“頂頭大哥”都是一個,這說明這就是個連通圖。當然,這裡還要考慮其中有孤立的點。