网易游戏2016校园招聘数据挖掘研究员在线笔试题和答案

2023-05-16


      刚做完网易在线笔试题,感触最深的地方是,虽然题目形式和ACM题目相似,但是内容更偏向于实际应用。总共有四个题目,第一个题目属于字符串匹配类型,难度较低,第二个题目是模拟SQL语句的输出,第三个题目是KNN算法,第四个题目是贝叶斯算法。题目偏基础,算法思想很容易想到,但如果平常从来没写过这类算法,再加上代码能力不是很强的话,写起来还是有点吃力的。下面是第一题,第三题,第四题的答案。

 

题目1 : 虚拟游戏世界实体分析

时间限制: 5000ms
单点时限: 1000ms
内存限制: 256MB

描述

虚拟游戏世界里面有很多实体,实体可能由很多子实体或者子属性构成。由于实体之间可能有非常之多的嵌套,查询某个实体或者属性属于第几层嵌套,以便将来对虚拟世界的修改和展示是一项待解决的问题,作为未来的虚拟世界分析员,你能用程序解决这个问题吗?

输入

输入数据可能由多组数据构成,每组数据由两行构成:

第一行是对虚拟世界的描述,实体或者属性由英文字母或者数字构成,子实体和子属性紧接着父实体嵌套在{}中,兄弟实体或者属性用“,”分隔。

第二行是要查询的属性或者实体,有且仅有一个。

注意数据输入可能很大。

输出

输出为查询的实体或者属性的层数;如果属性不存在,输出-1;如果有多个结果满足查询,请从小到大输出所有去重之后的结果,用”,”分隔

样例输入

Fruit{apple{shape,color},orange{taste,price}}
Fruit
Fruit{apple{shape,color},orange{taste,price}}
orange
Fruit{apple{shape,color},orange{color,price},color}
color  
样例输出

1
2
2,3  
代码:
#include <string>
#include <vector>
#include <iostream>	
#include <algorithm> 
using namespace std;

int main()
{ 
    string s;
	string query;	
    while(cin >> s >> query) {
		int i = 0;
		int j = 0;
		int h = 1;
		int begin = 0;
		vector<int> ans;
        for( i = 0; i < s.size(); i++) {
			if(s[i] == '{' || s[i] == '}' || s[i] == ',') {
				if(i - begin == query.size()) {
					for(j = 0; j < query.size(); j++) {
						if(query[j] != s[begin + j]) {
							break;
						}
					}
					if(j == query.size()) {
						ans.push_back(h);
					}
				}
				begin = i + 1;
			}
			if(s[i] == '{') {
				h++;
				
			} else if(s[i] == '}') {
				h--;
			} 
		}
		sort(ans.begin(), ans.end());  
		if(ans.size() == 0)
			cout << -1 << endl;
		else {
			cout << ans[0];
			for(int k = 1; k < ans.size(); k++) {
				if(ans[k] != ans[k-1])
					cout << "," << ans[k];
			}
			cout << endl;
		}
    }
    return 0;
}

题目3 : 游戏玩家分类

描述

理查德•巴图博士通过对游戏中玩家固定的行为模式进行观察,于1996年提出了巴图模型,尝试把玩家的不同行为模式进行分类。他将游戏玩家分成了成就型、探索型、社交型和杀手型。该分类方式本质上从玩家在游戏中的需求出发,根据具体的行为表现对其进行分类。推断玩家所属类型,对于游戏用户研究,精准营销投放都有非常重要的意义,因此对不同玩家进行分类是一项重要研究工作。为了实现分类模型,通过收集玩家在游戏中的不同行为数据并进行归一化,可以得到玩家的特征向量以及已知类型玩家的标签,如:

副本参与次数竞技场参与次数任务完成次数登陆频率充值额度玩家类型
0.80.50.60.90.2A
0.40.80.10.20.1B
0.90.10.50.60.9C
0.50.20.10.30.0D

(其中前五列数字为玩家的特征向量,最后一列字母是玩家类型,有A、B、C、D四种取值)

分类问题有多种解决算法,其中K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其思想是:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。请用该方法实现游戏玩家分类,距离度量函数采用欧氏距离。

输入

每个输入数据包含一组训练数据和一组测试数据。

第一行第一个数为KNN算法的k(k<=10000)值,第二个数为特征向量的长度L(L<=100),第三个数M(M>k, M<=10000)为训练数据行数,第四个数N(N<=10000)为测试数据行数。之后是M行训练数据和N行测试数据。每行中数据使用空格分隔。

输出

对于每行测试数据,输出该玩家的类型,例如“A”。如果前K个相似类型中,出现数量最多的类型有重复,则一起输出,以ABCD升序排列,例如“AC”。

样例输入

3 5 16 2
0.19 0.04 0.06 0.22 0.11 A
0.28 0.42 0.38 0.39 0.44 B
0.71 0.61 0.54 0.52 0.54 C
0.98 0.82 0.92 0.98 0.97 D
0.05 0.03 0.15 0.01 0.11 A
0.33 0.29 0.33 0.47 0.27 B
0.72 0.52 0.61 0.71 0.68 C
0.78 0.86 0.91 1.0 0.76 D
0.01 0.17 0.14 0.15 0.2 A
0.44 0.36 0.32 0.32 0.35 B
0.67 0.65 0.57 0.58 0.52 C
0.87 0.92 0.8 0.83 0.77 D
0.01 0.11 0.14 0.12 0.07 A
0.33 0.43 0.43 0.45 0.38 B
0.57 0.54 0.75 0.7 0.64 C
0.9 0.94 0.83 0.96 0.77 D
0.29 0.29 0.42 0.36 0.27
0.56 0.67 0.71 0.66 0.7  
样例输出

B
C  

代码:

#include <string>
#include <vector>
#include <iostream>	
#include <algorithm> 
using namespace std;

typedef struct
{
	vector<double> f;
	char label;
}Elem;

typedef struct
{
	double cost;
	int idx;
}NN;

typedef struct
{
	int cnt;
	int idx;
}LabelCnt;

bool operator<(const NN &x, const NN &y)
{
    return x.cost < y.cost;
}

bool operator<(const LabelCnt &x, const LabelCnt &y)
{
    return x.cnt > y.cnt;
}

double distance(vector<double> &f1, vector<double> &f2) {
	double sum = 0.0;
	for(int i = 0; i < f1.size(); i++) {
		sum += (f1[i] - f2[i]) * (f1[i] - f2[i]);
	}
	return sum;
}
int main()
{ 
    int k,L,M,N;
    while(cin >> k >> L >> M >> N) {
		int i = 0;
		int j = 0;
		vector<Elem> trainData;
		trainData.resize(M);
		for( i = 0; i < M; i++) {
			trainData[i].f.resize(L);
			for( j = 0; j < L; j++) {
				cin >> trainData[i].f[j];
			}
			cin >> trainData[i].label;
		}
		vector<Elem> testData;
		testData.resize(N);
		for( i = 0; i < N; i++) {
			testData[i].f.resize(L);
			for( j = 0; j < L; j++) {
				cin >> testData[i].f[j];
			}
			vector<NN> nnCost;
			nnCost.resize(M);
			int t = 0;
			for( t = 0; t < M; t++) {
				nnCost[t].idx = t;
				nnCost[t].cost = distance(trainData[t].f, testData[i].f);
			}
			sort(nnCost.begin(), nnCost.end());  
			vector<LabelCnt> labels;
			labels.resize(4);
			for( t = 0; t < labels.size(); t++) {
				labels[t].cnt = 0;
				labels[t].idx = t;
			}
			for( t = 0; t < k; t++) {
				int idx = nnCost[t].idx;
				int label = trainData[idx].label - 'A';
				labels[label].cnt++;
			}
			sort(labels.begin(), labels.end()); 
			vector<int> ans;
			ans.push_back(labels[0].idx);
			for( t = 1; t < labels.size(); t++) {
				if(labels[t].cnt == labels[t-1].cnt)
					ans.push_back(labels[t].idx);
				else
					break;
			}
			for( t = 0; t < ans.size(); t++) {
				cout << (char)(ans[t]+'A');
			}
			cout << endl;
		}
    }
    return 0;
}


题目4 : 好师父推算

时间限制: 5000ms
单点时限: 1000ms
内存限制: 256MB

描述

师徒系统普遍存在于各类网络游戏中,对于游戏促进新手留存具有重要意义,现在采集到如下信息:


好友个数   聊天次数   是否是好师父
    1          3        1
    2          1        2

  

希望你用naïve bayes算法基于“好友个数”和“聊天次数”推算某玩家是好师父的概率,以方便产品优化匹配规则。

输入

输入数据由多行构成,每行中的数据用“\t”分隔。第1行是1~3个用“\t”分隔的数字,表示输出第几个问题的答案,第2行是属性名称,包括fchatnum,cchatnum和remark三个属性,分别代表好友个数、聊天次数和是否是好师父。从第3行开始为训练数据,含义与第2行的属性名称相对应。好友个数和聊天次数取值都是1~10的整数,是否是好师父取值是1~2的整数,其中2表示好师父。

输出

根据第1行输入数据指定的编号输出以下3个小题的答案,多个小题答案使用换行“\n”分割。

第1题:输出好师父的先验概率。

第2题:输出好师父群体中好友个数取值的概率分布,依次对应1~10的概率取值,零值也要输出,中间用逗号分隔。

第3题:输出给定fchatnum=9,cchatnum=9的玩家是好师父的概率。

输出结果统一四舍五入保留小数点后3位。

完整样例输入下载

总计1000条数据,请在这里下载。

样例输入

1		2		3
fchatnum 	cchatnum	remark
1       2       1
3       3       1
1       1       1
6       9       2
3       7       2
4       6       2
4       2       2
3       8       2
1       1       1
8       4       2
……
  
样例输出

0.320
0.034,0.091,0.075,0.144,0.100,0.106,0.119,0.134,0.100,0.097
0.691  

代码:

#include <string>
#include <vector>
#include <iostream>	
#include <algorithm> 
using namespace std;

typedef struct
{
	vector<int> f;
}Elem;

void split(string s, vector<int> &values) {
	char sep = '\t';
	int begin = 0;
	for(int i = 0; i < s.size(); i++) {
		if(s[i] == sep) {
			int num = 0;
			for(int j = begin; j < i; j++) {
				num = num * 10 + s[j] - '0';
			}
			if(num > 0)
				values.push_back(num);		
			begin = i + 1;
		}
	}
	int num = 0;
	for(int j = begin; j < s.size(); j++) {
		num = num * 10 + s[j] - '0';
	}
	if(num > 0)
		values.push_back(num);
}

double getPrior(vector<Elem> &data, int label) {
	int good = 0;
	for(int i = 0; i < data.size(); i++) {
		if(data[i].f[2] == label)
			good++;
	}
	if(good == 0)
		return 0.0;
	return 1.0*good/data.size();
}

double getPosterior(vector<Elem> &data, int idx, int k, int label) {
	int cnt = 0;
	int sum = 0;
	for(int i = 0; i < data.size(); i++) {
		if(data[i].f[2] == label) {
			sum++;
			if(data[i].f[idx] == k)
				cnt++;
		}
		
	}
	if(cnt == 0)
		return 0.0;
	return 1.0*cnt/sum;
}

int main()
{ 
	char s[100];
	vector<int> titles;
	gets(s);
	string strLine(s);
	split(strLine, titles);
	gets(s);
    vector<Elem> data;
	Elem item;
	item.f.resize(3);
    while(cin >> item.f[0] >> item.f[1] >> item.f[2]) {
		data.push_back(item);
    }
	int i = 0;
	double prior1 = getPrior(data, 1);
	double prior2 = getPrior(data, 2);
	vector<double> posterior1_0(11,0.0);
	vector<double> posterior1_1(11,0.0);
	vector<double> posterior2_0(11,0.0);
	vector<double> posterior2_1(11,0.0);
	int k;
	for(k = 1; k <= 10; k++) {
		posterior1_0[k] = getPosterior(data, 0, k, 1);
		posterior1_1[k] = getPosterior(data, 1, k, 1);
		posterior2_0[k] = getPosterior(data, 0, k, 2);
		posterior2_1[k] = getPosterior(data, 1, k, 2);
	}
	for( i = 0; i < titles.size(); i++) {
		if(titles[i] == 1) {
			printf("%.3f\n",prior2);
		} else if(titles[i] == 2) {
			for(int j = 1; j <= 9; j++) {
				printf("%.3lf,",posterior2_0[j]);
			}
			double ans = 0.0;
			ans = posterior2_0[10];
			printf("%.3lf\n",ans);
		} else if(titles[i] == 3) {
			double ans = 0.0;
			ans = prior2 * posterior2_0[9] * posterior2_1[9];
			ans /= (prior1 * posterior1_0[9] * posterior1_1[9] + prior2 * posterior2_0[9] * posterior2_1[9]);
			printf("%.3lf\n",ans);
		}
	}
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网易游戏2016校园招聘数据挖掘研究员在线笔试题和答案 的相关文章

  • opencv-python 常用函数介绍

    目录 imread xff1a 读取图片 imshow xff1a 展示图片 resize xff1a 图片等比例缩放 split xff1a 获取所有像素的颜色值 merge xff1a 根据颜色值合成图片 VideoCapture xf
  • redis 内存占用分析

    在Redis命令行中 xff0c 执行MEMORY STATS命令查询内存使用详情 Redis实例的内存开销主要由两部分组成 xff1a 业务数据的内存开销 xff0c 该部分一般作为重点分析对象 非业务数据的内存开销 xff0c 例如主备
  • php laravel 分析 redis 各个key的内存占用情况

    lt php namespace App Console Commands Tools use Illuminate Console Command use Illuminate Support Facades DB class Redis
  • centos7手动修改dns

    DNS是计算机域名系统 Domain Name System 或Domain Name Service 的缩写 xff0c 它是由域名解析器和域名服务器组成的 域名服务器是指保存有该网络中所有主机的域名和对应IP地址 xff0c 并具有将域
  • 查看并关闭占用端口

    查看占用端口 sudo lsof i 8888 关闭占用端口 sudo kill 9 2558243
  • 从水果连连看到两条序列比对

    一 序列比对 Sequence Alignment 序列比对 xff08 sequence alignment xff09 xff0c 目前是生物信息学的基本研究方法 算法类似于连连看 xff0c 规则是上下两个水果一样 xff0c 就可以
  • Nginx 配置详解

    Nginx 配置 文章目录 Nginx 配置文件结构全局配置events 配置http 配置server 配置 Rewrite一 地址重写 xff0c 地址转发 xff0c 重定向二 URL 重写语法 xff1a 使用 xff1a 三 if
  • 趣谈网络协议(一)

    一般来说 xff0c 网上的购物 都是基于应用层的Http协议 那么在这一层协议书我们包装了什么呢 xff0c 请看下图 一 应用层 Http头 http1 1 POST URL 正文格式 content type 长度 content l
  • JS 中 Json 数据的快速排序

    主要方法 span class token comment 升序排列 span span class token keyword function span span class token function up span span cl
  • 生物信息学导师推荐(持续更新)

    本系列会持续更新 xff0c 帮助大家找到更适合自己的导师 xff0c 注意排名不分先后 xff0c 接下来我们开始介绍 xff1a 陈润生 单位 xff1a 中国科学院生物物理研究所 方向 xff1a 长非编码RNA以及编码小肽的系统发现
  • Python 中变量的多种复制方法(常规拷贝,浅拷贝,深拷贝)

    常规拷贝 大家常用的变量复制方法 xff0c 用 61 就行 但是 xff01 但是 xff01 但是 xff01 在我们复制字典和列表时会和我们预想的不一致 接下来 xff0c 做个小实验 常规拷贝在原始变量 x 的改变后 xff0c 因
  • 图解机器学习:分类模型性能评估指标

    人间出现一种怪病 xff0c 患病人群平时正常 xff0c 但偶尔暴饮暴食 xff0c 这种病从外观和现有医学手段无法分辨 为了应对疫情 xff0c 准备派齐天大圣去下界了解情况 事先神官从人间挑选了一些健康人和患病者来对大圣的业务能力进行
  • 数据库涉及大量数据查询时的注意事项

    避免频繁连接和关闭数据库 xff0c 这样会导致IO访问次数太频繁 设计表时要建立适当的索引 xff0c 尤其要在 where 及 order by 涉及的列上建立索引 避免全表扫描 xff0c 以下情况会导致放弃索引直接进行全部扫描 避免
  • axios 使用详解

    一 安装 cnpm install axios 二 使用 三种写法 span class token comment 第一种写法 span axios span class token punctuation span span class
  • 生物序列比对的几种应用场景(图文)

    今天和大家讨论几种序列比对的应用场景 xff0c 当然只是抛转引玉 xff0c 如果小伙伴有其他应用场景 xff0c 欢迎讨论 一 物种 基因的进化 二 基因组学 2 1 比较基因组学揭示保守区 2 2 比较基因组学揭示功能元件 例如上图的
  • 图解机器学习之回归模型性能评估指标

    一个房价预测的任务 xff0c 老板说你看看这个模型咋样 xff1f 我们先绘制一个坐标轴 xff1a Y 轴为房价 xff0c X 轴为年份 将过去房价数据绘制为绿色 xff0c 回归模型绘制为蓝色 关键问题是 xff0c 怎么知道这个模
  • Chrome 将 http 域名自动跳转 https 的解决方案

    问题来源 使用 Chrome 内核浏览器 xff0c 包括 Google Chrome xff0c edge xff0c 360浏览器等 为了安全在访问同一域名时 xff0c 只要访问过带有 https 域名 xff0c 如果再使用http
  • 一文读懂相分离(图文详解)

    目录 什么是相分离 xff1f 相分离的原理 相分离的分子功能 生物信息中的相分离 一 什么是相分离 xff1f 相分离 phase separation 本身是一个物理化学概念 xff0c 二元或多元混合物会在一定的条件下分离为不同的相
  • g++: 内部错误:Killed (程序 cc1plus)

    这个原因是内存不足 xff0c 在linux下增加临时swap空间 step 1 sudo dd if 61 dev zero of 61 home swap bs 61 64M count 61 16 注释 xff1a of 61 hom
  • React 开发 | 样式模块化

    1 使用 ES6 实现样式模块化 xff0c 避免样式冲突 index module css span class token punctuation span title span class token punctuation span

随机推荐

  • React 开发 | 父子组件间通信

    文章目录 一 省流二 父传子例子三 子传父例子 一 省流 父组件 gt 子组件 xff1a 通过 props 传递 子组件 gt 父组件 xff1a 通过 props 传递 xff0c 但是父组件需要提取给子组件传递一个预定义的函数 二 父
  • React 开发 | 常用 Hooks

    useState 作用 用于函数式组件操作 state xff0c 类似于类组件的 setState 写法 xff1a state setState 61 useState initValue state xff1a 状态变量名setSta
  • React 项目部署后,页面404解决

    解决方法一 xff1a Nginx 配置 span class token punctuation span listen span class token number 80 span span class token punctuati
  • 一文读懂 UniProt 数据库(2023 最新版)

    一 UniProt 数据库介绍 Uniprot xff08 Universal Protein xff09 是包含蛋白质序列 xff0c 功能信息 xff0c 研究论文索引的蛋白质数据库 xff0c 整合了包括EBI xff08 Europ
  • 理解泛型调用和函数调用签名

    这里通过五个示例逐步理解泛型调用和函数调用签名 span class token comment 64 Author Zheng Lei 64 Email baimoc 64 163 com 64 Date 2023 01 18 16 29
  • 图解统计学 10 | 贝叶斯公式与全概率公式

    文章目录 概率联合概率条件概率全概率公式贝叶斯公式 过年了 xff0c 作为水果店老板的我们 xff0c 一共进了三种水果 xff0c 其中 xff1a 西瓜 xff1a 50个 香蕉 xff1a 30个 橙子 xff1a 20个 为了方便
  • 中断处理流程

    大家都说在中断处理函数中不能调度 xff0c 或者说睡眠 这到底为什么 xff1f 下面看中断处理的过程 xff0c 从中是否能找到原因 中断发生后会调到 irq svc xff1a align 5 irq svc svc entry ir
  • ROS Publishers

    ROS的发布者 在python语言中 xff0c ROS发布者定义格式如下 xff1a pub1 61 rospy Publisher topic name message type queue size 61 size topic nam
  • 用已有镜像创建容器

    背景 想编译一套针对arm架构上CPU的keepalived xff0c 现有条件是 xff0c 有一套arm的CPU xff0c 上面已经安装了centos7 xff0c 为了不影响本身系统的环境 xff0c 所以想着创建一个容器来隔离环
  • Ubuntu 18.04生命周期现被扩展至10年

    为更好的与刚被蓝色巨人 IBM 收购的红帽展开竞争 xff0c Ubuntu 18 04 LTS长期支持版周期被扩展至整整10年 正常情况下 Ubuntu LTS 长期支持版的生命周期都是五年 xff0c 即在五年内这些版本都会持续提供安全
  • 卡尔曼滤波(Kalman filtering)小结

    最近项目用到了kalman滤波 xff0c 本博文简单介绍下卡尔曼滤波器的概念 原理和应用 xff0c 做个小结 概念 卡尔曼滤波 xff08 Kalman filtering xff09 一种利用线性系统状态方程 xff0c 通过系统输入
  • Cmake:编写CMakeLists.txt文件编译C/C++程序

    1 CMake编译原理 CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件
  • 官方免费的正版Xshell,人人都可以马上拥有

    找个 Xshell 咋就这么费劲 可以说 Xshell 是 Windows 平台下最好的第三方终端软件了 xff0c 程序员必备 但是屏幕前的你 xff0c 搜索下载 Xshell xff0c 都是跳到奇怪的下载网站 有时候下载的也是免费试
  • 第2章 梅西法 阅读

    梅西法可以用于任何对象集合的排名 xff0c 但是一定要预先定义好成对比较数据 比如乒乓球赛 xff0c 成对比较数据就是两个人PK的结果 xff1b 网页排序 xff0c 成对比较数据可以是两个网页的流量 梅西法的主要思路是构造一个最小二
  • 我与算法的缘分

    六年前 xff0c 我完全不知道算法是什么东西 六年后 xff0c 我看到算法就两眼放光 六年的时间让我从算法小菜鸟蜕变成算法爱好者 大一上学期 xff0c 我对算法一点概念都没有 xff0c 当时老师让我们用伪代码写算法 xff0c 我基
  • EM算法 实例讲解

    第一次接触EM算法 xff0c 是在完成半隐马尔科夫算法大作业时 我先在网上下载了两份Baum Welch算法的代码 xff0c 通过复制粘贴 xff0c 修修补补 xff0c 用java实现了HMM算法 xff08 应用是韦小宝掷两种骰子
  • 机器学习漫谈

    机器学习漫谈 数据挖掘 机器学习项目一般包括四个关键部分 xff0c 分别是 xff0c 数据分析 xff0c 特征工程 xff0c 建立模型 xff0c 验证 1 数据分析 从广义上讲 xff0c 数据分析包括数据收集 xff0c 数据处
  • 2015年机器学习/数据挖掘面试总结

    2015年机器学习 数据挖掘面试总结 明年硕士毕业 xff0c 今年开始找工作 在北方呆的太久 xff0c 想回湿润的南方 第一站 xff08 3月份 xff09 xff0c 阿里数据挖掘实习生面试 个人觉得 xff0c 阿里的面试是最人性
  • 研究生和本科有什么不同?

    本科学了4年计算机 xff0c 研究生又学了2年计算机 xff0c 感觉两个阶段的生活学习还是挺不一样的 一 在同学间的交流方面 xff0c 大学生比研究生交流更频繁 xff0c 交友更广泛 初中高中时 xff0c 大家座位固定 xff0c
  • 网易游戏2016校园招聘数据挖掘研究员在线笔试题和答案

    刚做完网易在线笔试题 xff0c 感触最深的地方是 xff0c 虽然题目形式和ACM题目相似 xff0c 但是内容更偏向于实际应用 总共有四个题目 xff0c 第一个题目属于字符串匹配类型 xff0c 难度较低 xff0c 第二个题目是模拟