vivo2018秋招软件开发笔试题

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;
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注