生活随笔
收集整理的這篇文章主要介紹了
牛客网解题-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 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};
char string[
100];
while (fgets(string,
100, stdin)) {length = strlen(string) -
1;
int j =
0;
for (; j < length; j++){
count[j] = string[j] -
'a';}
switch (length) {
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) {
index =
3 +
count[
0] * M +
count[
1] * N +
count[
2] * P +
count[
3];printf(
"%d\n",
index);}}
return 0;
}
#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腾讯秋招笔试编程题练习卷的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。