电子数字 网易游戏在线笔试 第一题 hihocoder
题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1
这个题目有几个算法考点:
(1)对于一个LED数码管(由7个发光二极管封装在一起,对应的二极管编号见所给链接),给你一串整数,每个数字表示对应的二极管亮,其他二极管明暗未知,由该串数据求出该数码管能表示出什么数字。
思路:就是将1~7数字(表示对应的二极管亮)映射到数组(vector<int>),表示哪些数字是需要该二极管灯亮。
map<int, vector<int>*> dic;
vector<int> v1 = { 2,3,5,6,7,8,9,0};//意思就是2,3,5,6,7,8,9这几个数字需要1号二极管亮!
vector<int> v2 = {4,5,6,8,9,0 };
vector<int> v3 = { 1,2,3,4,7,8,9,0 };
vector<int> v4 = {2,3,4,5,6,8,9};
vector<int> v5 = { 2,6,8,0 };
vector<int> v6 = { 1, 3, 4, 5, 6, 7,8,9,0 };
vector<int> v7 = { 2, 3, 5, 6, 8, 9, 0 };
dic[1] = &v1;
dic[2] = &v2;
dic[3] = &v3;
dic[4] = &v4;
dic[5] = &v5;
dic[6] = &v6;
dic[7] = &v7;
然后,利用哈希表map<int,int>来统计输入的数据串究竟能够表示出什么数字,需要求各个发光二极管所能表示的数字取交集,得到的就是该串LED数码管还能表示的数字。
(2)求给定一个正数N,和K个LED数码管,其中每个数码管可以表示出的数字是有限的,用vector<set<int>>存储,vector[0]这个数字集合就是第一个LED数码管所能表示的数字,并且第一个数码管对应最高位,整数N前面可以补零。求出数码管所能表示出的所有比N小的组合形式个数!(这个是题目的要求,将条件改为求所有小于等于N的组合形式个数,是不是要更复杂?自己将这个问题单独罗列出来,放到最下面去,构成问题3,同时自己将利用递归来实现这个函数)
下面是源代码(能通过题目已经给出的那个测试用例,其他还未知):
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
int main()
{ map<int, vector<int>*> dic;
vector<int> v1 = { ,,,,,,,};
vector<int> v2 = {,,,,, };
vector<int> v3 = { ,,,,,,, };
vector<int> v4 = {,,,,,,};
vector<int> v5 = { ,,, };
vector<int> v6 = { , , , , , ,,, };
vector<int> v7 = { , , , , , , };
dic[] = &v1;
dic[] = &v2;
dic[] = &v3;
dic[] = &v4;
dic[] = &v5;
dic[] = &v6;
dic[] = &v7; int len;//测试点个数
while (cin >> len && len != ){
//cin >> len;
for (int i = ; i < len; i++){
int K, N;
cin >> K >> N;
vector<set<int>> back(K,set<int>());
for (int j = ; j < K; j++){//处理K行数据
char str[];
vector<int> data;
cin.get();
cin.getline(str, , '\n');
for (int i = ; i < strlen(str); i++)//提取一行中的整数,保存到data当中,可以对其排序
{
if (str[i] != ' '){
int num = str[i] - '';
data.push_back(num);
}
}
sort(data.begin(), data.end());
map<int, int> inter;
for (int s1 = ; s1 < ; s1++){
inter[s1] = ;
}
inter[] = ;
for (int k = ; k < data.size(); k++){//将该二极管对应的备选数字添加到back中去,已经自动去重
vector<int>* ptr = dic[data[k]];
for (auto it = (*ptr).begin(); it != (*ptr).end(); it++){
inter[*it]++;
}
}
for (int s1 = ; s1 < ; s1++){
if (inter[s1] >= data.size())
back[j].insert(s1);
}
}//已经得到一个测试点的备选数字
vector<int> div;
for (int count = ; count < K; count++){
int temp = N % ;
div.push_back(temp);//div最前面是个位数字,back最前面是最左边的二极管对应最高位数字
N=N/;
}
int count = ;
for (int tag = ; tag < K; tag++){
auto it = back[tag];
int num = div[K - tag - ];
int count2 = ;
for (auto it2 = it.begin(); it2 != it.end(); it2++){
if (*it2 < num){
int sum = ;
for (int s1 = tag + ; s1 < K; s1++)
sum *= back[tag].size();
count += sum;
}
}
}
cout <<"结果:"<<count << endl;
}
}
return ;
}
(3)问题3
假定给自己一个数N,已经将其从最高位到最低位存储到了vector<int>val中(val[0]就是最高位),同时用vector<vector<int>>nums,来表示各个LED数码管能够表示的数字,求出所有LED数码管能表示出的小于等于N的数的总数量。函数接口 void helper(vector<vector<int>>& nums,vector<int>& val,int pos,int &count),
代码实现如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void helper(vector<vector<int>>& nums, vector<int>& val,int pos,int& count){
for (auto it = nums[pos].begin(); it != nums[pos].end();it++){
if (*it < val[pos]){
int count1 = ;
for (int i = pos + ; i < nums.size(); i++){
count1 = count1*nums[i].size();
}
count += count1;
}
else if (*it == val[pos]){
helper(nums, val, pos + , count);
}
}
}
int main()
{
vector<int> val = {,,};
vector<vector<int>> nums = { { , }, { , }, { , } };
int count = ;
int pos = ;
helper(nums, val, pos, count);
cout << "count=" << count << endl;
return ;
}
电子数字 网易游戏在线笔试 第一题 hihocoder的更多相关文章
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第一道——最佳路径
题目 给定一个 n*m 的矩阵 A ,矩阵中每一个元素为一个十六进制数.寻找一条从左上角都右下角的路径,每次只能向右或者向下移动, 使得路径上所有数字之积在 16 进制下的后缀 0 最少. 输入描述: ...
- 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第一道——最大连续区间和扩展
题目 给出一个长度为 n 的数组a1.a2.....ana1.a2.....an,请找出在所有连续区间 中,区间和最大同时这个区间 0 的个数小于等于 3 个,输出这个区间和. 输入描述: 第一行一个 ...
- unity,C#,游戏面试笔试真题
最开始的两家公司笔试面试题目 一家公司是学校聘请研究教育方面VR课件的公司,面试没几天,就收到了面试通过的消息,后面因为通过了另一家游戏公司而拒绝了. 另一家公司是一家游戏外企,在春熙路,当时笔试还可 ...
- 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和
题目 给 n 个实数 a_1, a_2 ... a_n, 要求计算这 n 个数两两之间差的绝对值下取整后的和是多少. 输入描述 第一行为一个正整数 n 和一个整数 m.接下来 n 行,第 i 行代表一 ...
- 18年今日头条笔试第一题题解:球迷(fans)
其实本题是加强版,原数据是100*100的,老师为了尊重我们的智商加成了3000*3000并进行了字符串处理…… 上原题~ 球迷 [问题描述] 一个球场C的球迷看台可容纳M*N个球迷.官方想统计一共有 ...
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数
题目: 给 n 个正整数 a_1,…,a_n, 将 n 个数顺序排成一列后分割成 m 段,每一段的分数被记为这段内所有数的和,该次分割的分数被记为 m 段分数的最大值.问所有分割方案中分割分数的最小值 ...
- 金山网络2014春季Android实习生招聘-成都站-笔试第一题
实现单例模式,并实现方法int getResult(float a),将a*8后返回. package jinshanwangluo.exam; /** * @author guoxm * @date ...
- Legendary Items-微软实习生笔试第一题
题目如下: 这道题难点不仅在于正确理解题意,判断递归条件,更在于用数学方法推出解决公式.因为N最大为1百万,而内存只有256MB, 所以暴力递归肯定会超时,超空间. 不过,我才疏学浅,又没有大量时间去 ...
- 【面试笔试算法】Program 2:Amusing Digits(网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 网易成立于1997年6月,是中国领先的互联网技术公司.其相继推出了门户网站.在线游戏.电子邮箱.在线教育.电子商务等多种服 ...
随机推荐
- 玩转UICollectionViewLayout
前言: 实 现垂直方向的单列表来说,使用UITableView足以:若是需要构建横向滑动列表.gridView等直线型布局,则使用 UICollectionView+UICollectionViewF ...
- NodeJS搭建HTTPS服务器
[NodeJS搭建HTTPS服务器] http://cnodejs.org/topic/54745ac22804a0997d38b32d
- R常见的几种常见统计图
1,向日葵散点图 2,热图 (颜色越深,数值越大) 3,折线图(散点图),绘制散点图集用 paris(data.frame)
- C# DateTime转Json汇总
DateTime转换成json的时候容易出现不想要的格式,在网上搜索了相关的解决方法copy如下: 参考http://www.newtonsoft.com/json/help/html/DatesIn ...
- (转载)HTML5 LocalStorage 本地存储
原文地址:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地 ...
- C# 开源压缩组件比较
SevenZipSharp check()为检查压缩包,有BUG,360创建的zip压缩包有无密码,密码错对都返回true DotNetZip 提供的函数比较人性化,缺点是只支持zip SharpCo ...
- 关于16年2月14日以后上传AppStore出现:Missing iOS Distribution signing identity for...的问题
2016年2月14日以后打包上传AppStore会发现出现如下的问题: 导致问题的原因是:下边这个证书过期了 以下是苹果官方给出的回应: Thanks for bringing this to the ...
- pip install lxml出错解决
初学Python各种版本问题,安装pip install lxml各种出错,解决方法:py -2 -m pip install wheel(PY3上我上个帖子已经标了),http://www.lfd. ...
- ios -网络加载json和本地加载json
1网络加载json的时候,要在模型的实现文件里写: - (void)setValue:(id)value forKey:(NSString *)key { } 2本地加载json的时候,要在模型的实现 ...
- HTML页面弹出自定义对话框带遮蔽罩(使用JavaScript)
转载:http://blog.sina.com.cn/s/blog_610f47c50100ohe4.html 原理其实很简单:首先绘制弹出的自定义对话框,将其使用display:none隐藏,因为设 ...