1. 程式人生 > >牛客網研究生機試題刷題記錄

牛客網研究生機試題刷題記錄

牛客網:清華大學

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.度為偶數。

這裡採用並查集的思想,把線路中給出的兩個端點,都找出他們的“頂頭大哥”,方便後續操作。如果所有的點的“頂頭大哥”都是一個,這說明這就是個連通圖。當然,這裡還要考慮其中有孤立的點。