vivo2018秋招软件开发笔试题
标签:笔试
vivo2018秋招软件开发笔试题
选择题
- 线程共享部分包括:进程代码段、进程共有资源(全局变量)、进程打开的文件描述符、消息队列、信号的处理器、进程当前目录、进程用户ID、进程组ID;线程独占资源:线程ID、寄存器组的值、栈、错误返回码、线程的信号屏蔽码、线程的优先级。
-
循环队列长度=(rear-front+Quesize)%Quesize
-
动态分配内存返回空指针,说明分配内存未成功,有三种可能:
(1)分配的空间太小
(2)分配的空间被当作内存碎片处理
(3)val取值过大,即分配空间过大会导致内存溢出 -
定义C++类,阻止C++类对象的相互赋值
只要重载=的定义在private或protected下面即可,重载原型的const修饰及函数体内容无所谓
1 2 3 4 |
class A{ protected: A& operator=(const A&){}; |
- sprintf、strcpy、strncpy及 memcpy 函数,请问这些函数功能有什么区别?从安全角度考虑一般应该用哪个函数复制字符串?
答:sprintf是格式化字符串函数;strcpy是字符串赋值函数;strncpy是字符串赋值函数,但可以指定最大复制长度;memcpy是内存复制函数。从安全角度来看应该选择strncpy,不易出现越界异常。
- 约瑟夫环是一个数学应用题:已知n个人(编号1、2、..n)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个又从1开始报数,数到m的那个人又出列;依次规律重复下去,直到圆桌周围的人全部出列。请编写一个程序,给定n、m计算出列人员先后顺序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#include <stdio.h> #include <stdlib.h> typedef struct Node { int num; struct Node *next; }LinkList; LinkList *creat(int n) { LinkList *p, *q, *head; int i = 1; p = (LinkList *)malloc(sizeof(LinkList)); p->num = i; head = p; for (i = 2; i <= n; i++) { q = (LinkList *)malloc(sizeof(LinkList)); q->num = i; p->next = q; p = q; } p->next = head; return head; } void fun(LinkList *L, int m) { int i; LinkList *p, *s; LinkList *q = NULL; p = L; printf("出列顺序为:"); while (p->next != p) { for (i = 1; i <= m; i++) { q = p; p = p->next; } printf("%5d", p->num); s = p; q->next = p->next; p = p->next; free(s); } printf("%5d\n", p->num); } int main() { LinkList *L; int n, m; n = 9; m = 5; L = creat(n); fun(L, m); system("pause"); return 0; } |
- 编程找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include<stdio.h> #include<stdlib.h> #include<string.h> char* longest(char *a, char *b) { int alen = strlen(a); int blen = strlen(b); int i, j, index, max = 0, num = 0; int start; char *str; for (i = 0; i < alen; i++) { for (j = 0; j < blen; j++) { //这里的start1、start2是比较关键的 int start1 = i; int start2 = j; while ((start1 <= alen - 1) && (start2 <= blen - 1) && (a[start1++] == b[start2++])) num++; if (num > max)//如果num是当前最大匹配的个数,则赋给max,并且在start记下str1最长匹配开始的位置 { max = num; start = i; } num = 0;//如果num不是当前最大的,则赋为0值继续循环 } } str = (char *)malloc(max + 1); strncpy(str, a + start, max);//从字符串a的start位置开始,拷贝max个字符到str中,这就是我们找出的最大子串 str[max] = '\0'; return str; } int main() { char a[] = "abccade"; char b[] = "dgcadde"; char *str; str = longest(a, b); printf("%s\n", str); free(str); system("pause"); return 0; } |