博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网易2017春招笔试真题编程题集合
阅读量:4677 次
发布时间:2019-06-09

本文共 9948 字,大约阅读时间需要 33 分钟。

网易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个整数length,表示每个任务的长度为length[i]kb,每个数均为1024的倍数。

输出描述 :输出一个整数,表示最少需要处理的时间

输入例子 :5

     3072 3072 7168 3072 1024

输出例子: 9216

思路分析:

题意很清晰,就是给一个数组,要我们把他分成两份并分别求和,使得这两个和的最大值最小。我下意识的想法是枚举出所有有可能的和,但是复杂度大概是O(2^n) ,貌似会超时。可是仔细一看,length[i] 的取值在[1, 4096] 之间,那么最多n个数的和的范围肯定在[n, 4096n] 之间。

代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 int n; 6 int a[51]; 7 set
s; 8 int sum = 0; 9 int main()10 {11 cin >> n;12 for (int i = 0; i
> tmp;16 a[i] = tmp / 1024;17 sum += a[i];18 }19 s.insert(0);20 for (int i = 0; i
added;23 for (set
::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
::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)

第四行为办公室坐标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
2 #include
3 using namespace std; 4 int main() 5 { 6 int n; 7 cin >> n; 8 vector
taxiX(n, 0); 9 vector
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
2 #include
3 #include
4 #include
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 else20 {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
2 #include
3 4 using namespace std; 5 6 int main() 7 { 8 int n, k; 9 cin >> n >> k;10 vector
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
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
2 #include
3 using namespace std; 4 int getSetNum(int w, int x, int y, int z) 5 { 6 int count = 0; 7 set
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
#include
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;}

结果:

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
2 #include
3 #include
4 #include
5 //为了避免重复,将单词放入set里 6 using namespace std; 7 8 int main() 9 {10 int n, m;11 cin >> n >> m;12 set
str1, str2;13 for (int i = 0; i
> str;18 str1.insert(str);19 }20 for (int i = 0; i
> str;25 str2.insert(str);26 }27 int ans = 0;28 for (set
::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个数sequence,以空格分隔

输出描述: 输出消除重复元素之后的序列,以空格分隔,行末无空格

输入例子: 9

    100 100 100 99 99 99 100 100 100

输出例子: 99 100

思路分析

从后向前先判重后加入即可,合理利用集合set的insert函数,去除重复元素

代码:

1 #include
2 #include
3 #include
4 #include
5 6 //从后向前先判重后加入即可。 7 using namespace std; 8 int main() 9 {10 int n;11 cin >> n;12 int a[51] = { 0 };13 vector
arr;14 set
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
2 #include
3 #include
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 else24 {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 }

结果:

 

转载于:https://www.cnblogs.com/lxt1105/p/6690040.html

你可能感兴趣的文章
MVC---- DataSet 页面遍历
查看>>
WebApi请求原理
查看>>
[Node.js] node-persist: localStorage on the server
查看>>
jquery.event 研究学习之bind篇
查看>>
LOJ #108. 多项式乘法
查看>>
军事机密(Secret.pas)
查看>>
正向代理和反向代理
查看>>
@RequestParam、@RequestBody和@ModelAttribute区别
查看>>
.net 缓存
查看>>
egret 取消自动连接github
查看>>
libusb开发指南
查看>>
SAS基础 -- 逻辑库不存在问题解决
查看>>
Servlet监听器统计在线人数
查看>>
第2章 数字之魅——寻找发帖“水王”
查看>>
spring5.0新特性
查看>>
ivy 入门
查看>>
eclipse jsp html 格式化 format
查看>>
关于手机端IOS系统微信中虚拟键盘遮挡input输入框问题的解决方案 草稿
查看>>
css3背景、边框、和补丁相关属性 (二)
查看>>
Python--小功能应用
查看>>