2017 CVTE春招内推专场 C/C++软件开发岗笔试编程题
先来一波吐槽:选择题全是不定项选择,考的内容在我看来,“反正我接受唔到咯”。
比如:
1.Windows操作系统某个通信机制(具体题目忘了,反正答案我选了个熟悉的名词“消息队列”)。
EXM???服,我还真从来没关注过Windows的任何机制。手动黑人问号。
x. 以下哪些属于Linux的发行版本?A.OpenSUSE B.Red-hat C. CentOS D.Ubuntu
EXM???所谓的考Linux就是这样考的?再次手动黑人问号。
还有一题问的是Linux设备调用接口什么的,没搞过,真不清楚,瞎选。
其他的还挺常规,比如问哪些属于交换排序、哪些排序算法序列的初始状态不影响比较次数、多态、死锁、计算机网络(考的是FTP的传输模式)等。
-----------------分割线------------------
两道题,都很简单。
1. 给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-1。
sample:
输入:“abcdefcba”
输出:3
解法:先遍历字符串,用一个map记录每个字符出现的次数,再次遍历字符串,找到第一个只出现一次的字符,复杂度为O(n)。
1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 #include <map> 5 using namespace std; 6 7 int getCharIndex(const char *str) 8 { 9 map<char, int> cmap; 10 int length = strlen(str); 11 for (int i = 0; i < length; ++i) 12 ++ cmap[str[i]]; 13 14 int ret = -1; 15 for (int i = 0; i < length; ++i) 16 if (cmap[str[i]] == 1) 17 { 18 ret = i; 19 break; 20 } 21 22 return ret; 23 } 24 25 int main() 26 { 27 string str; 28 cin >> str; 29 cout << getCharIndex(str.c_str()) << endl; 30 }
2. n个人围着圆桌坐,编号1~n,从第k个开始报数,报到m者出列,后一个继续从1开始报数。问最后一个出列者的编号。输入n, k, m.
sample1:
输入:3 1 1
输出:3
sample2:
输入:3 2 2
输出:1
解法:首先,看到这种题目就感觉会有特别的规律,但思前想后还是归纳不出来,只好用循环链表直接模拟,复杂度O(nm)。
1 #include <iostream> 2 3 using namespace std; 4 5 typedef struct Node 6 { 7 int num; 8 Node *next; 9 } Node; 10 11 // 构造循环链表 12 void construct(Node **head, int n) 13 { 14 *head = new Node; 15 (*head)->num = 1; 16 (*head)->next = NULL; 17 Node *pNode = *head; 18 19 for (int i = 2; i <= n; i++) 20 { 21 Node *pNew = new Node; 22 pNew->num = i; 23 pNew->next = NULL; 24 while (pNode->next != NULL) 25 pNode = pNode->next; 26 27 pNode->next = pNew; 28 pNode = pNode->next; 29 } 30 pNode->next = *head; 31 } 32 33 34 int solve(int n, int k, int m) 35 { 36 // 过滤非法输入 37 if (n < 1 || k < 1 || k > n || m <= 0) 38 return 0; 39 40 // 数到1就出列的情况下,即从k开始逐个出列 41 // 若k = 1, 最后一个为n; 否则为k-1. 42 else if (m == 1) 43 return (k == 1 ? n : k-1); 44 45 // 构造循环链表 46 Node *head = NULL; 47 construct(&head, n); 48 49 // 从k开始报数,故先跳到第k个 50 Node *pNode = head; 51 for (int i = k; i > 1; --i) 52 pNode = pNode->next; 53 54 // 模拟报数n-1次, 每次出列一人,删除出列的结点 55 int num = 1; 56 Node *pPrev; 57 for (int i = 0; i < n - 1; i++) 58 { 59 while (num < m) 60 { 61 pPrev = pNode; 62 pNode = pNode->next; 63 ++num; 64 } 65 Node *pToDel = pNode; 66 pNode = pNode->next; 67 pPrev->next = pNode; 68 delete pToDel; 69 num = 1; 70 } 71 int ret = pNode->num; 72 delete pNode; // 避免内存泄露,释放最后一个结点 73 return ret; 74 } 75 int main() 76 { 77 int n, k, m; 78 int t; 79 cin >> t; 80 while (t--) 81 { 82 cin >> n >> k >> m; 83 cout << solve(n, k, m) << endl; 84 } 85 }
总结:编程题很简单,但选择题感觉错了挺多的,估计笔试都过不了,有点不开心。反正我GG了,后面那批兄弟姐妹们加油。