牛客网解题-2017腾讯秋招笔试编程题练习卷
序言
今天15:00-17:00的腾讯笔试,提前做了套练习卷。虽然下午的笔试题答得一塌糊涂,但是之前做的题还是总结一下吧
题目
四个题:编码index + 游戏任务标记 + 和为正整数的质数对 + 纬度编码
编码index这个题,我的理解与答案有挺大出入,放在最后一个来讲吧。
2. 游戏任务标记
题目描述
游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024]。
请用32个unsigned int类型来记录着1024个任务是否已经完成。初始状态都是未完成。
输入两个参数,都是任务ID,需要设置第一个ID的任务为已经完成;并检查第二个ID的任务是否已经完成。 输出一个参数,如果第二个ID的任务已经完成输出1,如果未完成输出0。如果第一或第二个ID不在[1,1024]范围,则输出-1。
输入输出示例
输入:1024 1024
输出:1
解题思路
用32个unsigned int类型来记录1024个数,每个unsigned int应记录32个,即用每位来表示每个任务,1表示完成,0表示未完成。
验证第二次任务ID是否与第一次任务ID相同,直接用第二次的任务ID来提取对应标记位,如果已被标记为1则表示已完成,否则就是未完成。
代码(C)
#include <stdio.h>int main()
{unsigned int array[32];int i = 0, j = 0;for (; i < 32; i++)array[i] = 0;int missionId[2] = {0};while (scanf("%d", &missionId[j]) != EOF && getchar() != '\n')j++;if (missionId[0] > 1024 || missionId[0] < 1 || missionId[1] > 1024 || missionId[1] < 1){printf("%d\n", -1);return 0;}else{array[(missionId[0] - 1)/32] = 1 << ((missionId[0] - 1) % 32); //元素存储printf("%d\n", array[(missionId[1] - 1)/32] >> ((missionId[1] - 1) % 32) & 1 ? 1 : 0);}return 0;
}
3. 和为正整数的质数对
题目描述
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
输入输出示例
输入:10
输出:2
解题思路
首先写出质数判断函数(2~n-1不能除尽即为质数)
代码(C)
#include <stdio.h>
#include <math.h>int PrimeNumJudge(int n);int main()
{int N;int a,b;int count = 0;scanf("%d", &N);a = 1;while (a <= (N / 2)){b = N - a;if (PrimeNumJudge(a) == 0 || PrimeNumJudge(b) == 0){a++;}else{count++;a++;}}printf("%d\n", count);return 0;
}int PrimeNumJudge(int n)
{//int upper = sqrt(n); //改进质数验证int i;if (n == 1) return 0;for (i = 2; i < n; i++){if (n % i == 0)return 0;}return 1;
}
4. 纬度编码
题目描述
geohash编码:geohash常用于将二维的经纬度转换为字符串,分为两步:第一步是经纬度的二进制编码,第二步是base32转码。
此题考察纬度的二进制编码:算法对纬度[-90, 90]通过二分法进行无限逼近(取决于所需精度,本题精度为6)。
注意,本题进行二分法逼近过程中只采用向下取整来进行二分,针对二分中间值属于右区间。算法举例如下: 针对纬度为80进行二进制编码过程:
1) 区间[-90, 90]进行二分为[-90, 0),[0, 90],成为左右区间,可以确定80为右区间,标记为1;
2) 针对上一步的右区间[0, 90]进行二分为[0, 45),[45, 90],可以确定80是右区间,标记为1;
3) 针对[45, 90]进行二分为[45, 67),[67,90],可以确定80为右区间,标记为1;
4) 针对[67,90]进行二分为[67, 78),[78,90],可以确定80为右区间,标记为1;
5) 针对[78, 90]进行二分为[78, 84),[84, 90],可以确定80为左区间,标记为0;
6) 针对[78, 84)进行二分为[78, 81), [81, 84),可以确定80为左区间,标记为0;输入输出示例
输入:80
输出:111100
解题思路
因为只要求精度达到6,设置一个6元素数组,记录每一次的编码取值
记录区间的上下界,并用二分法不断调整代码(C)
#include <stdio.h>int main()
{int left, right, middle;left = -90, right = 90;int latitude, count = 0;int array[6] = {0};scanf("%d", &latitude);while (count < 6){middle = (left + right) / 2;if (latitude < middle){right = middle;array[count] = 0;}else{left = middle;array[count] = 1;}count++;}int i = 0;for (; i < count; i++){printf("%d", array[i]);}return 0;
}
1. 编码index
题目描述
假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下:
a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。
编写一个函数,输入是任意一个编码,输出这个编码对应的Index.
输入输出示例
输入:baca
输出:16331
解题思路
这个题的我的理解,编码分布是这样的a,aa,aaa,aaaa,…,aaay,aaba,…,aaby,aaca,…aacy,….ayya,…,ayyy,b,ba,baa,baaa,…,然而实际分布并不是这样,不过我并没有从题目中看出类似a,aa,aaa,aaaa,…,aaay,ab,aba,abaa,…,abay,…,abyy,ac,aca,acaa,…的分布规律。
所以这里仅给出我自己理解的代码实现(另外三题AC,本题未通过)
代码(C)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{int P = 25;int N = P * 25;int M = N * 25;int length; //记录输入字符串长度int index = 0;int count[4] = {0}; //记录四位字符与a字符各自的差值char string[100];while (fgets(string, 100, stdin)) //循环输入{length = strlen(string) - 1; //strlen()不计'\0',此处-1可能与fgets函数自动添加\0有关int j = 0;for (; j < length; j++){count[j] = string[j] - 'a';}switch (length) //小于3位的字符{case 1:printf("%d\n", count[0] * M);break;case 2:printf("%d\n", count[0] * M + 1);break;case 3:printf("%d\n", count[0] * M + 2);break;default:break;}if (length == 4) //4位字符{index = 3 + count[0] * M + count[1] * N + count[2] * P + count[3];printf("%d\n",index);}}return 0;
}
//牛客网上的AC代码一例
#include <stdio.h>
#include <string.h>#define N1 1
#define N2 25
#define N3 (25 * 25)
#define N4 (25 * 25 * 25)#define C1 N1
#define C2 (N1 + N2)
#define C3 (N1 + N2 + N3)
#define C4 (N1 + N2 + N3 + N4)int main()
{char code[5] = {0};scanf("%s", code);int index = 0;switch(strlen(code)){case 4: index += C1 * (code[3] - 'a') + 1;case 3: index += C2 * (code[2] - 'a') + 1;case 2: index += C3 * (code[1] - 'a') + 1;case 1: index += C4 * (code[0] - 'a');default: break;}printf("%d\n", index);return 0;
}
Acknowledgements:
http://blog.csdn.net/jiangnanyouzi/article/details/6827534 (编码index AC解法)
2017.09.13
牛客网解题-2017腾讯秋招笔试编程题练习卷相关推荐
- 美团点评2017秋招笔试编程题
美团点评2017秋招笔试编程题 1, 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步.求玩家走到第n步(n<=骰子最大点数且是 ...
- 【牛客】快手2020校园招聘秋招笔试--算法A试卷
链接:https://www.nowcoder.com/questionTerminal/c8cfc98711a14a3fbc587ca5aabc09ee 来源:牛客网 [编程题]计算累计平方和. 热 ...
- 腾讯2017秋招笔试编程题--游戏任务标记
游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024].请用32个unsigned int类型来记录着1024个任务是否已经完成.初始状态都 ...
- Java——快手2020校园招聘秋招笔试--[编程题]运动会
题目: 一年一度的快手运动会又要开始了,同学们终于有一天可以离开鼠标键盘显示器,全身心的投入到各种体育项目中.UED设计师小红虽然没有参加体育项目,但她的责任重大,因为她是拉拉队的队长,她需要在每个项 ...
- Java——快手2020校园招聘秋招笔试[编程题]质因数统计
题目: 我们知道每一个大于1的整数都一定是质数或者可以用质数的乘积来表示,如10=2*5.现在请设计一个程序,对于给定的一个(1,N] 之间的正整数(N取值不超过10万),你需要统计(1,N] 之间所 ...
- 【新华三】H3C 秋招 笔试编程题
点击上方蓝字关注我,我们一起学编程 欢迎小伙伴们分享.转载.私信.赞赏. H3C 笔试编程题. 微信搜索:编程笔记本 微信搜索:编程笔记本 微信搜索:编程笔记本 1. 星期匹配 题目描述: 输入一个字 ...
- 涂鸦智能2021秋招笔试编程题
2道题,60分钟,比较简单 1.给一串包含字母和数字的字符串,从中找到第二大的数字,如果没有第二大的数字,则返回-1 public static int secondHighest (String s ...
- 滴滴出行2017秋招笔试真题-编程题汇总_Java实现
滴滴出行2017秋招笔试真题-编程题汇总_Java实现 注:有的题参考别人的思路,用我最容易理解的代码编的程序,所以可以不能最优的解法,后续我会进行更新,只是一个思路,我的笔记而已,所以不喜勿喷~~~ ...
- 【笔试题】京东2017秋招笔试真题
笔试题 京东2017秋招笔试真题 1.进制均值 时间限制 C/C++语言 1000MS;其他语言 3000MS 内存限制 C/C++语言 65536KB;其他语言 589824KB 题目描述 尽管是一 ...
- 腾讯2019秋招笔试真题
1.小Q爬塔 描述:小Q正在攀登一座宝塔,这座塔很特别,塔总共有n曾层,但是没两层之间的净高却不相同,所以造成了小Q爬过每层的时间也不同.如果某一层的高度为x,那么爬过这一层锁需的还是件也是x.小Q孩 ...
最新文章
- SQL Server将数据导出SQL脚本的方法 转
- 应急响应-Yara规则木马检测
- Shell命令-Sort,Join
- 分块编码(Transfer-Encoding:chunked)
- 计算机系要考英语口语吗,2015年高考英语口语由计算机“打分”,这些细节要注意!...
- 预防医学的曙光 | 微软要用AI构建免疫系统图谱
- 超级无敌的TcpDump
- java修饰符super_Java 继承 方法重写 super关键字 访问权限修饰符
- python网络编程第三版网盘_Python网络编程(socketserver、TFTP云盘、HTTPServer服务器模型)...
- 记录一次项目中代码大致优化方向
- miRbase 数据库简介
- 工业4.0智能电批扭力输出异常问题
- linux的ffmpeg转换视频为mp4,使用开源软件FFmpeg将各种格式视频转换成MP4视频格式(最简单方法)...
- 智慧医院绩效管理方案
- 一道小学题,解答了我与学霸的差距
- Python中调用Linux命令之os.system、os.popen
- 数据库系统概论第六章(关系数据理论)知识点总结(2)—— 码的概念总结
- Android 是Google开发的基于Linux平台的开源手机操作系统
- java 公交管理系统 代码_基于jsp的公交管理系统-JavaEE实现公交管理系统 - java项目源码...
- 生日快乐python编程代码_如何用C语言编写一个很炫的生日快乐的程序?
热门文章
- 大学四年因为读了这13本书,我成了别人眼中的大神!
- 题目 1548: 盾神与砝码称重
- iphone11pro市场价_iPhone11 Pro Max:再见
- 中国通胀真相:美国向全球转嫁经济调整成本
- 联想计算机从金丝顿u盘启动,联想笔记本不从U盘启动解决方法
- java的标识符_Java的标识符
- 基于智能手机传感器数据的人类行为识别
- win7装matlab教程,win7系统怎么安装matlab软件(图文教程)
- java 日期 yyyy_Java时间格式化时YYYY(大写)和yyyy(小写)的区别
- html5新增哪些属性,html5中新增哪些form属性