vivo2018秋招软件开发笔试题
选择题
- 线程共享部分包括:进程代码段、进程共有资源(全局变量)、进程打开的文件描述符、消息队列、信号的处理器、进程当前目录、进程用户ID、进程组ID;线程独占资源:线程ID、寄存器组的值、栈、错误返回码、线程的信号屏蔽码、线程的优先级。
-
循环队列长度=(rear-front+Quesize)%Quesize
-
动态分配内存返回空指针,说明分配内存未成功,有三种可能:
(1)分配的空间太小
(2)分配的空间被当作内存碎片处理
(3)val取值过大,即分配空间过大会导致内存溢出 -
定义C++类,阻止C++类对象的相互赋值
只要重载=的定义在private或protected下面即可,重载原型的const修饰及函数体内容无所谓
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计算出列人员先后顺序。
#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"
#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;
}
文章评论