vivo2018秋招软件开发笔试题

选择题

  1. 线程共享部分包括:进程代码段、进程共有资源(全局变量)、进程打开的文件描述符、消息队列、信号的处理器、进程当前目录、进程用户ID、进程组ID;线程独占资源:线程ID、寄存器组的值、栈、错误返回码、线程的信号屏蔽码、线程的优先级。

  2. 循环队列长度=(rear-front+Quesize)%Quesize

  3. 动态分配内存返回空指针,说明分配内存未成功,有三种可能:
    (1)分配的空间太小
    (2)分配的空间被当作内存碎片处理
    (3)val取值过大,即分配空间过大会导致内存溢出

  4. 定义C++类,阻止C++类对象的相互赋值

只要重载=的定义在private或protected下面即可,重载原型的const修饰及函数体内容无所谓

class A{protected: A& operator=(const A&){};
  1. sprintf、strcpy、strncpy及 memcpy 函数,请问这些函数功能有什么区别?从安全角度考虑一般应该用哪个函数复制字符串? 

答:sprintf是格式化字符串函数;strcpy是字符串赋值函数;strncpy是字符串赋值函数,但可以指定最大复制长度;memcpy是内存复制函数。从安全角度来看应该选择strncpy,不易出现越界异常。

  1. 约瑟夫环是一个数学应用题:已知n个人(编号1、2、..n)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个又从1开始报数,数到m的那个人又出列;依次规律重复下去,直到圆桌周围的人全部出列。请编写一个程序,给定n、m计算出列人员先后顺序。
#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;}
  1. 编程找出两个字符串中最大公共子字符串,如”abccade”,”dgcadde”的最大子串为”cad”
#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;}