網易2017春招筆試真題編程題集合
題目來源:牛客網 https://www.nowcoder.com/profile/7952866/test/7811777/83061
1、雙核處理
題目描述
一種雙核CPU的兩個核能夠同時的處理任務,現在有n個已知數據量的任務需要交給CPU處理,假設已知CPU的每個核1秒可以處理1kb,每個核同時只能處理一項任務。n個任務可以按照任意順序放入CPU進行處理,現在需要設計一個方案讓CPU處理完這批任務所需的時間最少,求這個最小的時間。
輸入描述
輸入包括兩行: 第一行為整數n(1 ≤ n ≤ 50)
? ?第二行為n個整數lengthi,表示每個任務的長度為length[i]kb,每個數均為1024的倍數。
網易互聯網產品策劃筆試?輸出描述 :輸出一個整數,表示最少需要處理的時間
輸入例子 :5
3072 3072 7168 3072 1024
輸出例子: 9216
思路分析:
題意很清晰,就是給一個數組,要我們把他分成兩份并分別求和,使得這兩個和的最大值最小。我下意識的想法是枚舉出所有有可能的和,但是復雜度大概是O(2^n) ,貌似會超時。可是仔細一看,length[i] 的取值在[1, 4096] 之間,那么最多n個數的和的范圍肯定在[n, 4096n] 之間。
代碼:
1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 int n; 6 int a[51]; 7 set<int>s; 8 int sum = 0; 9 int main() 10 { 11 cin >> n; 12 for (int i = 0; i<n; i++) 13 { 14 int tmp; 15 cin >> tmp; 16 a[i] = tmp / 1024; 17 sum += a[i]; 18 } 19 s.insert(0); 20 for (int i = 0; i<n; i++) 21 { 22 set<int>added; 23 for (set<int>::iterator it = s.begin(); it != s.end(); it++) 24 { 25 added.insert(*it + a[i]); 26 } 27 s.insert(added.begin(), added.end()); 28 } 29 int ans = sum; 30 for (set<int>::iterator it = s.begin(); it != s.end(); it++) 31 { 32 ans = min(ans, max(*it, sum - *it)); 33 } 34 cout << ans * 1024 << endl; 35 }
結果:
廣東事業單位考試真題、
2、趕去公司
題目描述
終于到周末啦!小易走在市區的街道上準備找朋友聚會,突然服務器發來警報,小易需要立即回公司修復這個緊急bug。假設市區是一個無限大的區域,每條街道假設坐標是(X,Y),小易當前在(0,0)街道,辦公室在(gx,gy)街道上。小易周圍有多個出租車打車點,小易趕去辦公室有兩種選擇,一種就是走路去公司,另外一種就是走到一個出租車打車點,然后從打車點的位置坐出租車去公司。每次移動到相鄰的街道(橫向或者縱向)走路將會花費walkTime時間,打車將花費taxiTime時間。小易需要盡快趕到公司去,現在小易想知道他最快需要花費多少時間去公司。 輸入描述: 輸入數據包括五行:
第一行為周圍出租車打車點的個數n(1 ≤ n ≤ 50)
第二行為每個出租車打車點的橫坐標tX[i] (-10000 ≤ tX[i] ≤ 10000)
第三行為每個出租車打車點的縱坐標tY[i] (-10000 ≤ tY[i] ≤ 10000)
2019年執業藥師考試試題真題,第四行為辦公室坐標gx,gy(-10000 ≤ gx,gy ≤ 10000),以空格分隔
第五行為走路時間walkTime(1 ≤ walkTime ≤ 1000)和taxiTime(1 ≤ taxiTime ≤ 1000),以空格分隔
輸出描述: 輸出一個整數表示,小易最快能趕到辦公室的時間
輸入例子: 2
-2? -2
教師資格證面試真題, 0?? -2
-4?? -2
15?? 3
輸出例子: 42
思路分析
基礎題,先算步行的時間,再枚舉每個打車點算出打的時間,找到時間最短的即可。直接進行比較就可以,沒有復雜的過程。
代碼:
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main() 5 { 6 int n; 7 cin >> n; 8 vector<int> taxiX(n, 0); 9 vector<int> taxiY(n, 0); 10 for (int i = 0; i < n; i++) 11 cin >> taxiX[i]; 12 for (int i = 0; i < n; i++) 13 cin >> taxiY[i]; 14 int gx, gy; 15 cin >> gx >> gy; 16 int taxiTime, walkTime; 17 cin >> walkTime >> taxiTime; 18 int ans = walkTime*(abs(gx) + abs(gy)); //不打車所用的時間 19 for (int j = 0; j < n; j++) 20 { 21 int tmp = walkTime*(abs(taxiX[j]) + abs(taxiY[j])) + taxiTime*(abs(gx - taxiX[j]) + abs(gy - taxiY[j])); 22 if (tmp < ans) 23 ans = tmp; 24 } 25 cout << ans << endl; 26 return 0; 27 }
結果:
網易游戲運營筆試題及答案?
3、調整隊形
題目描述
在幼兒園有n個小朋友排列為一個隊伍,從左到右一個挨著一個編號為(0~n-1)。其中有一些是男生,有一些是女生,男生用’B’表示,女生用’G’表示。小朋友們都很頑皮,當一個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情況最少。你只能在原隊形上進行調整,每次調整只能讓相鄰的兩個小朋友交換位置,現在需要盡快完成隊伍調整,你需要計算出最少需要調整多少次可以讓上述情況最少。例如: GGBBG -> GGBGB -> GGGBB 這樣就使之前的兩處男女相鄰變為一處相鄰,需要調整隊形2次 輸入描述: 輸入數據包括一個長度為n且只包含G和B的字符串.n不超過50.
輸出描述: 輸出一個整數,表示最少需要的調整隊伍的次數
輸入例子: GGBBG
輸出例子: 2
思路分析:
網易筆試題目?我們對于串中第一個’B’然后計算把它swap到第一個位置需要多少次,第二個’B’swap到第二個位置需要多少次…依次類推..
然后對于’G’同理, 最后取個較小值即為答案。
代碼:
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 7 int main() 8 { 9 string str; 10 cin >> str; 11 int boyCount = 0, girlCount = 0, boy = 0, girl = 0; 12 for (int i = 0; i < str.size(); i++) 13 { 14 if (str[i] == 'B') 15 { 16 boyCount += i - boy; 17 boy++; 18 } 19 else 20 { 21 girlCount += i - girl; 22 girl++; 23 } 24 } 25 cout << min(boyCount, girlCount) << endl; 26 }
結果:
4、魔力手環
題目描述
小易擁有一個擁有魔力的手環上面有n個數字(構成一個環),當這個魔力手環每次使用魔力的時候就會發生一種奇特的變化:每個數字會變成自己跟后面一個數字的和(最后一個數字的后面一個數字是第一個),一旦某個位置的數字大于等于100就馬上對100取模(比如某個位置變為103,就會自動變為3).現在給出這個魔力手環的構成,請你計算出使用k次魔力之后魔力手環的狀態。
輸入描述: 輸入數據包括兩行: 第一行為兩個整數n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔 第二行為魔力手環初始的n個數,以空格分隔。范圍都在0至99.
輸出描述: 輸出魔力手環使用k次之后的狀態,以空格分隔,行末無空格。
網易游戲筆試。輸入例子: 3 2
? 1 2 3
輸出例子: 8 9 7
思路分析:
直接按邏輯進行運算,比較費時,推薦使用快速矩陣冪算法,這里采用的是直接算。
代碼:
1 #include<iostream> 2 #include<vector> 3 4 using namespace std; 5 6 int main() 7 { 8 int n, k; 9 cin >> n >> k; 10 vector<long> arr ; 11 for (int i = 0; i <= n; i++) 12 arr.push_back(0); 13 for (int i = 1; i <= n; i++) 14 cin >> arr[i]; 15 vector<long> tmp = arr; 16 for (int j = 1; j <= k; j++) 17 { 18 int i = 1; 19 while (i < n ) 20 { 21 tmp[i] += arr[i + 1]; 22 if (tmp[i]>100) 23 tmp[i]%= 100; 24 i++; 25 } 26 while (i==n) 27 { 28 tmp[i] += arr[1]; 29 if (tmp[i]>100) 30 tmp[i] %= 100; 31 i++; 32 } 33 arr = tmp; 34 } 35 cout << arr[1]; 36 for (int i = 2; i <= n; i++) 37 cout <<" "<< arr[i]; 38 cout << endl; 39 return 0; 40 }
結果:
5、集合
題目描述
網易秋招筆試題。小易最近在數學課上學習到了集合的概念,集合有三個特征:1.確定性 2.互異性 3.無序性. 小易的老師給了小易這樣一個集合: S = { p/q | w ≤ p ≤ x, y ≤ q ≤ z } 需要根據給定的w,x,y,z,求出集合中一共有多少個元素。小易才學習了集合還解決不了這個復雜的問題,需要你來幫助他。
輸入描述: 輸入包括一行: 一共4個整數分別是w(1 ≤ w ≤ x),x(1 ≤ x ≤ 100),y(1 ≤ y ≤ z),z(1 ≤ z ≤ 100).以空格分隔
輸出描述: 輸出集合中元素的個數
輸入例子: 1 10 1 1
輸出例子: 10
思路分析
互聯網秋招筆試,題意就是給分數判重,顯然我們不能直接算,因為浮點數是不精確的,乘以1.0000就可以了,然后丟進set里就好了。
代碼:
1 #include<iostream> 2 #include<set> 3 using namespace std; 4 int getSetNum(int w, int x, int y, int z) 5 { 6 int count = 0; 7 set<double> s; 8 for (int i = w; i <= x; i++) 9 for (int j = y; j <= z; j++) 10 { 11 s.insert(i*1.0000 / j); 12 } 13 count = s.size(); 14 return count; 15 } 16 int main() 17 { 18 int w, x, y, z; 19 cin >> w >> x >> y >> z; 20 int ans; 21 ans = getSetNum(w, x, y, z); 22 cout << ans << endl; 23 return 0; 24 }
結果:
6、奇怪的表達式求值
題目描述
常規的表達式求值,我們都會根據計算的優先級來計算。比如/的優先級就高于+-。但是小易所生活的世界的表達式規則很簡單,從左往右依次計算即可,而且小易所在的世界沒有除法,意味著表達式中沒有/,只有(+, - 和 )。現在給出一個表達式,需要你幫忙計算出小易所在的世界這個表達式的值為多少
輸入描述: 輸入為一行字符串,即一個表達式。其中運算符只有-,+,*。參與計算的數字只有0~9. 保證表達式都是合法的,排列規則如樣例所示。
輸出描述: 輸出一個數,即表達式的值
網易校招題目?輸入例子: 3+5*7
輸出例子: 56
思路分析:
關鍵之處在于:輸入的一個數字和下一個數字之間肯定隔著一個操作符,所以在第一個for循環的時候i=i+2,依次取數,再取操作符進行運算。
代碼:
#include<iostream> #include<string> using namespace std;int main() {string str;cin >> str;int ans = str[0] - '0';for (int i = 1; i < str.length() - 1; i += 2){//關鍵之處i+=2if (str[i] == '*')ans = ans * (str[i + 1] - '0');else if (str[i] == '+')ans = ans + (str[i + 1] - '0');else {ans = ans - (str[i + 1] - '0');}}cout << ans << endl;return 0; }
結果:
7、小易記單詞
題目描述
小易參與了一個記單詞的小游戲。游戲開始系統提供了m個不同的單詞,小易記憶一段時間之后需要在紙上寫出他記住的單詞。小易一共寫出了n個他能記住的單詞,如果小易寫出的單詞是在系統提供的,將獲得這個單詞長度的平方的分數。注意小易寫出的單詞可能重復,但是對于每個正確的單詞只能計分一次。
輸入描述: 輸入數據包括三行:
第一行為兩個整數n(1 ≤ n ≤ 50)和m(1 ≤ m ≤ 50)。以空格分隔
第二行為n個字符串,表示小易能記住的單詞,以空格分隔,每個單詞的長度小于等于50。
第三行為m個字符串,系統提供的單詞,以空格分隔,每個單詞的長度小于等于50。
輸出描述: 輸出一個整數表示小易能獲得的分數
輸入例子: 3 4
apple orange strawberry strawberry orange grapefruit watermelon
輸出例子: 136
思路分析
把能記住的單詞丟進set里,可以去除重復單詞,合理利用set的insert函數,然后判斷每一個是不是在系統提供的集合里即可。
代碼:
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<set> 5 //為了避免重復,將單詞放入set里 6 using namespace std; 7 8 int main() 9 { 10 int n, m; 11 cin >> n >> m; 12 set<string> str1, str2; 13 for (int i = 0; i<n; i++) 14 { 15 //讀入小易記住的單詞 16 string str; 17 cin >> str; 18 str1.insert(str); 19 } 20 for (int i = 0; i<m; i++) 21 { 22 //讀入系統提供的單詞 23 string str; 24 cin >> str; 25 str2.insert(str); 26 } 27 int ans = 0; 28 for (set<string>::iterator it = str1.begin(); it != str1.end(); it++) 29 { 30 if (str2.find(*it) != str2.end()) 31 { 32 //find()函數返回指向查找元素的迭代器,如果不存在返回set的end()迭代器. 33 ans += it->length() * it->length();//計算分數:單詞長度的平方 34 } 35 } 36 cout << ans << endl; 37 }
結果:
8、消除重復元素
題目描述
小易有一個長度為n序列,小易想移除掉里面的重復元素,但是小易想是對于每種元素保留最后出現的那個。小易遇到了困難,希望你來幫助他。
輸入描述:
輸入包括兩行: 第一行為序列長度n(1 ≤ n ≤ 50)
?? 第二行為n個數sequencei,以空格分隔
輸出描述: 輸出消除重復元素之后的序列,以空格分隔,行末無空格
輸入例子: 9
100 100 100 99 99 99 100 100 100
輸出例子: 99 100
思路分析
從后向前先判重后加入即可,合理利用集合set的insert函數,去除重復元素
代碼:
1 #include<iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<set> 5 6 //從后向前先判重后加入即可。 7 using namespace std; 8 int main() 9 { 10 int n; 11 cin >> n; 12 int a[51] = { 0 }; 13 vector<int> arr; 14 set<int> s; 15 for (int i = 0; i < n; i++) 16 cin >> a[i]; 17 for (int i = n - 1; i >= 0; i--) 18 { 19 if (s.find(a[i]) == s.end()) 20 { 21 s.insert(a[i]); 22 arr.push_back(a[i]); 23 } 24 } 25 cout << arr[arr.size() - 1]; 26 for (int i = arr.size() - 2; i >= 0; i--) 27 { 28 cout << " " << arr[i]; 29 } 30 cout << endl; 31 return 0; 32 }
結果:
9、涂棋盤
題目描述
小易有一塊n*n的棋盤,棋盤的每一個格子都為黑色或者白色,小易現在要用他喜歡的紅色去涂畫棋盤。小易會找出棋盤中某一列中擁有相同顏色的最大的區域去涂畫,幫助小易算算他會涂畫多少個棋格。
輸入描述: 輸入數據包括n+1行:
第一行為一個整數n(1 ≤ n ≤ 50),即棋盤的大小
接下來的n行每行一個字符串表示第i行棋盤的顏色,’W’表示白色,’B’表示黑色
輸出描述: 輸出小易會涂畫的區域大小
輸入例子: 3
BWW
BBB
BWB
輸出例子: 3
思路分析:
注意,只是找某一列的最大區域,并不是整個棋盤的最大區域,所以比較簡單。
代碼:
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 int main() 7 { 8 string str[52]; 9 int n; 10 cin >> n; 11 for (int i = 0; i < n; i++) 12 cin >> str[i]; 13 int maxCnt = 0;//保存最大區域的值 14 for (int j = 0; j < n; j++) 15 { 16 int cnt = 1;//臨時保存每一列的最大區域的值 17 for (int i = 1; i < n; i++) 18 { 19 if (str[i][j] == str[i - 1][j]) 20 { 21 cnt++; 22 } 23 else 24 { 25 maxCnt = max(maxCnt, cnt); 26 cnt = 1; 27 } 28 29 } 30 maxCnt = max(maxCnt, cnt); 31 } 32 cout << maxCnt << endl; 33 return 0; 34 }
結果:
?