序言

今天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腾讯秋招笔试编程题练习卷相关推荐

  1. 美团点评2017秋招笔试编程题

    美团点评2017秋招笔试编程题 1, 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步.求玩家走到第n步(n<=骰子最大点数且是 ...

  2. 【牛客】快手2020校园招聘秋招笔试--算法A试卷

    链接:https://www.nowcoder.com/questionTerminal/c8cfc98711a14a3fbc587ca5aabc09ee 来源:牛客网 [编程题]计算累计平方和. 热 ...

  3. 腾讯2017秋招笔试编程题--游戏任务标记

    游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024].请用32个unsigned int类型来记录着1024个任务是否已经完成.初始状态都 ...

  4. Java——快手2020校园招聘秋招笔试--[编程题]运动会

    题目: 一年一度的快手运动会又要开始了,同学们终于有一天可以离开鼠标键盘显示器,全身心的投入到各种体育项目中.UED设计师小红虽然没有参加体育项目,但她的责任重大,因为她是拉拉队的队长,她需要在每个项 ...

  5. Java——快手2020校园招聘秋招笔试[编程题]质因数统计

    题目: 我们知道每一个大于1的整数都一定是质数或者可以用质数的乘积来表示,如10=2*5.现在请设计一个程序,对于给定的一个(1,N] 之间的正整数(N取值不超过10万),你需要统计(1,N] 之间所 ...

  6. 【新华三】H3C 秋招 笔试编程题

    点击上方蓝字关注我,我们一起学编程 欢迎小伙伴们分享.转载.私信.赞赏. H3C 笔试编程题. 微信搜索:编程笔记本 微信搜索:编程笔记本 微信搜索:编程笔记本 1. 星期匹配 题目描述: 输入一个字 ...

  7. 涂鸦智能2021秋招笔试编程题

    2道题,60分钟,比较简单 1.给一串包含字母和数字的字符串,从中找到第二大的数字,如果没有第二大的数字,则返回-1 public static int secondHighest (String s ...

  8. 滴滴出行2017秋招笔试真题-编程题汇总_Java实现

    滴滴出行2017秋招笔试真题-编程题汇总_Java实现 注:有的题参考别人的思路,用我最容易理解的代码编的程序,所以可以不能最优的解法,后续我会进行更新,只是一个思路,我的笔记而已,所以不喜勿喷~~~ ...

  9. 【笔试题】京东2017秋招笔试真题

    笔试题 京东2017秋招笔试真题 1.进制均值 时间限制 C/C++语言 1000MS;其他语言 3000MS 内存限制 C/C++语言 65536KB;其他语言 589824KB 题目描述 尽管是一 ...

  10. 腾讯2019秋招笔试真题

    1.小Q爬塔 描述:小Q正在攀登一座宝塔,这座塔很特别,塔总共有n曾层,但是没两层之间的净高却不相同,所以造成了小Q爬过每层的时间也不同.如果某一层的高度为x,那么爬过这一层锁需的还是件也是x.小Q孩 ...

最新文章

  1. SQL Server将数据导出SQL脚本的方法 转
  2. 应急响应-Yara规则木马检测
  3. Shell命令-Sort,Join
  4. 分块编码(Transfer-Encoding:chunked)
  5. 计算机系要考英语口语吗,2015年高考英语口语由计算机“打分”,这些细节要注意!...
  6. 预防医学的曙光 | 微软要用AI构建免疫系统图谱
  7. 超级无敌的TcpDump
  8. java修饰符super_Java 继承 方法重写 super关键字 访问权限修饰符
  9. python网络编程第三版网盘_Python网络编程(socketserver、TFTP云盘、HTTPServer服务器模型)...
  10. 记录一次项目中代码大致优化方向
  11. miRbase 数据库简介
  12. 工业4.0智能电批扭力输出异常问题
  13. linux的ffmpeg转换视频为mp4,使用开源软件FFmpeg将各种格式视频转换成MP4视频格式(最简单方法)...
  14. 智慧医院绩效管理方案
  15. 一道小学题,解答了我与学霸的差距
  16. Python中调用Linux命令之os.system、os.popen
  17. 数据库系统概论第六章(关系数据理论)知识点总结(2)—— 码的概念总结
  18. Android 是Google开发的基于Linux平台的开源手机操作系统
  19. java 公交管理系统 代码_基于jsp的公交管理系统-JavaEE实现公交管理系统 - java项目源码...
  20. 生日快乐python编程代码_如何用C语言编写一个很炫的生日快乐的程序?

热门文章

  1. 大学四年因为读了这13本书,我成了别人眼中的大神!
  2. 题目 1548: 盾神与砝码称重
  3. iphone11pro市场价_iPhone11 Pro Max:再见
  4. 中国通胀真相:美国向全球转嫁经济调整成本
  5. 联想计算机从金丝顿u盘启动,联想笔记本不从U盘启动解决方法
  6. java的标识符_Java的标识符
  7. 基于智能手机传感器数据的人类行为识别
  8. win7装matlab教程,win7系统怎么安装matlab软件(图文教程)
  9. java 日期 yyyy_Java时间格式化时YYYY(大写)和yyyy(小写)的区别
  10. html5新增哪些属性,html5中新增哪些form属性