網易2017春招筆試真題編程題集合

網易2017春招筆試真題編程題集合

題目來源:牛客網 https://www.nowcoder.com/profile/7952866/test/7811777/83061ios

一、雙核處理

題目描述

一種雙核CPU的兩個核可以同時的處理任務,如今有n個已知數據量的任務須要交給CPU處理,假設已知CPU的每一個核1秒能夠處理1kb,每一個核同時只能處理一項任務。n個任務能夠按照任意順序放入CPU進行處理,如今須要設計一個方案讓CPU處理完這批任務所需的時間最少,求這個最小的時間。算法

輸入描述編程

輸入包括兩行: 第一行爲整數n(1 ≤ n ≤ 50)數組

         第二行爲n個整數lengthi,表示每一個任務的長度爲length[i]kb,每一個數均爲1024的倍數。服務器

輸出描述 :輸出一個整數,表示最少須要處理的時間app

輸入例子 :5函數

     3072 3072 7168 3072 1024學習

輸出例子: 9216ui

思路分析:

題意很清晰,就是給一個數組,要咱們把他分紅兩份並分別求和,使得這兩個和的最大值最小。我下意識的想法是枚舉出全部有可能的和,可是複雜度大概是O(2^n) ,貌似會超時。但是仔細一看,length[i] 的取值在[1, 4096] 之間,那麼最多n個數的和的範圍確定在[n, 4096n] 之間。spa

代碼:

 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 }

結果:

二、趕去公司

題目描述

終於到週末啦!小易走在市區的街道上準備找朋友聚會,忽然服務器發來警報,小易須要當即回公司修復這個緊急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)

第四行爲辦公室座標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 }

結果:

三、調整隊形

題目描述

在幼兒園有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 }

結果:

四、魔力手環

題目描述

小易擁有一個擁有魔力的手環上面有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 }

結果:

五、集合

題目描述

小易最近在數學課上學習到了集合的概念,集合有三個特徵: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 }

結果:

六、奇怪的表達式求值

題目描述

常規的表達式求值,咱們都會根據計算的優先級來計算。好比/的優先級就高於+-。可是小易所生活的世界的表達式規則很簡單,從左往右依次計算便可,並且小易所在的世界沒有除法,意味着表達式中沒有/,只有(+, - 和 )。如今給出一個表達式,須要你幫忙計算出小易所在的世界這個表達式的值爲多少

輸入描述: 輸入爲一行字符串,即一個表達式。其中運算符只有-,+,*。參與計算的數字只有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+=2
        if (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;
}

結果:

七、小易記單詞

題目描述

小易參與了一個記單詞的小遊戲。遊戲開始系統提供了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 }

結果:

八、消除重複元素

題目描述

小易有一個長度爲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 }

結果:

九、塗棋盤

題目描述

小易有一塊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 }

結果:

相關文章
相關標籤/搜索