牛客网解题-2017网易雷火实习生笔试题
来源:互联网 发布:怎么在淘宝论坛发帖子 编辑:程序博客网 时间:2024/06/09 17:21
序言
明天网易游戏的笔试,先做一套练习卷熟悉一下。
一共4道编程:字符串编码 + 最大和 + 推箱子 + 赛马
第三题在下篇文章中单独解答,这里仅介绍1,2,4题。
1. 字符串编码
题目描述
给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成4A1B2C1D2A。
输入输出描述
输入:每个测试输入包含1个测试用例
每个测试用例输入只有一行字符串,字符串只包括大写英文字母,长度不超过10000。输出:输出编码后的字符串
输入输出描述
输入:AAAABCCDAA输出:4A1B2C1D2A
解题思路
提取连续字符个数,不过关键在于表示时数字字符转换以及数字字符对应正确
代码(C语言,AC)
#include <stdio.h>#include <string.h>#include <math.h>int NumInvert(int n, int *len){ *len = 0; int m = n; while (m != 0) { m = m / 10; (*len)++; } int array[*len]; int i = 0; while (n != 0) { array[i++] = n % 10; n = n / 10; } i = 0; int length = *len - 1; while (i < *len) { n += (int)ceil(array[i++]*pow((double)10, (double)length)); length--; } return n;}int main(){ char string[10000]; scanf("%s", string); char jilu[15000]; int i = 0, flag = 0, count = 0, length = 0; char zifu = string[flag]; while (string[flag] != '\0') { while (string[flag] == zifu) { count++; flag++; } count = NumInvert(count, &length); while (length > 0) //对应位字符提取 { jilu[i++] = count % 10 + '0'; count = count / 10; length--; } jilu[i++] = zifu; zifu = string[flag]; } int len = strlen(jilu); i = 0; for (; i < len; i++) { printf("%c", jilu[i]); } return 0;}
2. 最大和
题目描述
在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
输入输出描述
输入:
每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :
3 <= N <= 100
1 <= D <= N
接下来有N行,每行N个数字d:
0 <= d <= 100输出:
输出一个整数,表示找到的和的最大值输入输出描述
输入:4 287 98 79 6110 27 95 7020 64 73 2971 65 15 0输出:193
解题思路
对应找出横向,纵向,左上到右下,右上到左下的最大值比较
代码(C语言,21% AC)
这题并没有AC,如果读者发现其中问题出处,欢迎指出交流
#include <stdio.h>int main(){ int N, D; scanf("%d %d", &N, &D); int arr[N][N]; //如果定义在scanf之前,编译器停止工作 int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { scanf("%d", &arr[i][j]); } } //横向比较 int max_heng = 0; int count, flag, max_temp; i = 0; while (i < N) { count = 0; flag = 0; max_temp = 0; for (flag = 0; flag < D; flag++) { max_temp = max_temp + arr[i][flag]; } while (flag < N) { if (max_temp + arr[i][flag] - arr[i][count] > max_temp) max_temp = max_temp + arr[i][flag] - arr[i][count]; flag++; count++; } if (max_temp > max_heng) max_heng = max_temp; i++; } //纵向比较 int max_zong = 0; j = 0; while (j < N) { count = 0; flag = 0; max_temp = 0; for (flag = 0; flag < D; flag++) max_temp = max_temp + arr[flag][j]; while (flag < N) { if (max_temp + arr[flag][j] - arr[count][j] > max_temp) max_temp = max_temp + arr[flag][j] - arr[count][j]; flag++; count++; } if (max_temp > max_zong) max_zong = max_temp; j++; } //左上到右下 int max_zuo = 0; i = 0; j = 0; int jishu, row, column; for (i = 0; i <= N - D; i++) { for (j = 0; j <= N - D; j++) { max_temp = 0; jishu = 0; row = i, column = j; for (jishu = 0; jishu < D; jishu++) { max_temp = max_temp + arr[row][column]; row++; column++; } if (max_zuo < max_temp) max_zuo = max_temp; } } //右上到左下 int max_you = 0; i = 0; j = N - 1; for (i = 0; i <= N - D; i++) { for (j = N - 1; j >= D - 1; j--) { max_temp = 0; jishu = 0; row = i, column = j; for (jishu = 0; jishu < D; jishu++) { max_temp = max_temp + arr[row][column]; row++; column--; } if (max_you < max_temp) max_you = max_temp; } } int maximum = max_heng; if (max_zong > maximum) maximum = max_zong; if (max_zuo > maximum) maximum = max_zuo; if (max_you > maximum) maximum = max_you; printf("%d\n", maximum); return 0;}
4. 赛马
题目描述
在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少
输入输出描述
输入:
每个测试输入包含1个测试用例
输入只有一行,一个正整数N
1 <= N <= 1000输出:
输出一个浮点数,精确到小数点后四位数字,表示剩余马匹数量的数学期望输入输出描述
输入:12输出:1.00001.5000
解题思路
这是一个离散分布求数学期望的数学模型,重要的是求出剩余马匹数和对应的概率值,但是求概率值的时候发现,到3匹马以上就不太好分析了。
我们从马的速度角度去考虑,马的速度总可以从大到小排列 v1 > v2 > v3 >… > vN,不同速度的马存活与否和马出现的位置直接相关。
速度最快v1马无论出现在什么位置都能存活,存活概率为1
速度v2只有出现在最快马之前才能存活,由于马的速度是均匀随机分布,就是说v2在最快马之前之后等概,为1/2
速度v3出现在v2之前、v2 v1之间、v1之后也是等概,为1/3可以通过1 + 1/2 + 1/3 + … + 1/n 求有马匹数量的数学期望
代码(C语言,AC)
#include <stdio.h>double HorseE(int num) { int i = 1; double qiwang = 0; while (i <= num) { qiwang = qiwang + (double)1 / (double)i; i++; } return qiwang;}int main() { int n; scanf("%d", &n); double expectation = HorseE(n); printf("%.4lf", expectation); return 0;}
2017.09.15
- 牛客网解题-2017网易雷火实习生笔试题
- 名企笔试:网易游戏雷火盘古2017实习生招聘笔试题(字符串编码)
- 2017网易游戏雷火盘古实习生招聘笔试真题 第四题
- 2017网易游戏雷火盘古实习生招聘笔试真题
- 2017网易游戏雷火盘古实习生招聘笔试真题 2
- 2017网易游戏雷火盘古实习生招聘笔试真题:字符串编码 [python]
- 2017网易游戏雷火盘古实习生招聘笔试真题:推箱子 [python]
- 2017网易游戏雷火盘古实习生招聘笔试真题:最大和 [python]
- 2017网易游戏雷火盘古实习生招聘笔试真题:赛马 [python]
- 网易2017实习生笔试7
- 网易2017实习生笔试6
- 网易2017实习生笔试5
- 2018网易游戏雷火盘古实习生笔试
- 网易考拉2017暑假实习生招聘笔试题(网络问题)
- 网易2017实习生笔试编程题-魔力手环
- 2017年网易测试开发实习生笔试题
- 网易2017实习生招聘笔试题 C++开发工程师
- 2017网易游戏雷火盘古实习生招聘笔试:字符串编码
- 60个国外免费3D模型下载网站
- ubuntu/deepin安装Scrapy
- ubantu下的搜狗输入法安装
- CTS、CTS-V、GTS版本更新,及其注意事项
- YOLO v2 CPU 使用 openblas 加速
- 牛客网解题-2017网易雷火实习生笔试题
- 4-5 基础堆排序和Heapify(两个版本的基于堆的排序算法)
- STM32半主机模式
- apt-get update 失败
- 代理设计模式1(知识点总结)
- HashSet如何重写了hashcode()和equals()
- Android 手机卫士(6)消息处理机制
- 《算法与数据结构》学习笔记 4-6 优化的堆排序(原地堆排序)
- oracle中单引号和双引号的作用