日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客网解题-2017腾讯秋招笔试编程题练习卷

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网解题-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腾讯秋招笔试编程题练习卷的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。