linux c/c++ 面试题目整理(二)

11、编写一个二分查找函数,下界为low,上界为high

递归法:

template<class elemtype>
int BSearch(elemtype a[], elemtype x,int low,int high)
{
    int mid;
    if (low > high)
        return -1;
    mid = (low + high)/2;
    if (x == a[mid])
    {
        return mid;
    }
    if (x < a[mid])
    {
        return BSearch(a, x, low, mid-1);
    }
    else
    {
        return BSearch(a,x, mid+1, high);
    }
}

非递归法:

int BSearch(elemtype a[],elemtype key, int n)
{
    int low,high,mid;
    low = 0;
    high = n-1;
    while(low < high)
    {
        mid = (low + high)/2;
        if (a[mid] == key)
            return mid;
        else if(a[mid] < key)
            low = mid+1;
        else
            high = mid-1;
    }
    return -1;
}

注意:二分查找算法前提是已经排好序的。

12、字符串逆序方法

  • 一是原始字符串的头和尾进行交换;
  • 二是另外开辟一个字符串空间, 将原始字符串逆序保存到新的字符串末;

13、链表反转(逆序)

//常规方法:
struct Node
{
    int data;
    struct Node* next;
}
void reverse(Node* &head)
{
    if (head == NULL)
        return;
    Node* pre, *cur, *ne;
    pre = head;
    cur = head->next;
    while(cur)
    {
        ne = cur->next;
        cur->next = pre;
        pre = cur;
        cur = ne;
    }
    head->next = NULL;
    head = pre;
}
//递归方法:
Node* reverse(Node* head)
{
    if (p == NULL || p->next == NULL)
    {
        return head;
    }
    Node* newHead = reverse(head->next);
    head->next->next = head;
    head->next = NULL;
    return newHead;
}

14、什么是平衡二叉树?

左右子树都是平衡二叉树, 且左右子树的深度差值的绝对值不大于1.

15、堆栈溢出一般是什么原因造成的?

数组越界访问

16、当申请的内存资源没有及时释放而一直重复申请时,会出现什么情况?

内存泄露,内存被占用会一直增长。

17、写出float x与“零值”比较的语句

if (x > -0.000001 && x<0.000001)

18、Internet采用哪种网络协议?该协议的主要层次结构是什么?

tcp/ip协议
主要层次结构采用5层结构:应用层/传输层/网络层/数据链路层/物理层
应用层协议:telnet,ftp,http
传输层协议:tcp,udp
网络层协议:ip,icmp,igmp
(7层结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)

19、IP地址的编码分为哪两部分

IP地址由两部分组成,网络号和主机号。 不过要和“子网掩码”按位与之后才能区别哪些是网络位,哪些是主机位。

20、用户输入M、N值, 从1到N开始循环数数, 每次数到M就输出当前数据, 直到全部输出,写出C程序。

这是约瑟夫方法,可使用循环链表,用取余操作数,也可用数组,下面是c语言的数组程序:

void yuesef(int M,int N)
{
    int* p = new int[N];
    int s = 0,r = 0;
    for(int i=0;i<N;i++)
    {
        p[i] = 1;
    }
    for(int i=0;i<N;i++)
    {
        if (p[i] == 1)
            s++;
        if (s == M)
        {
            printf(“%d\n”,i+1);
            p[i] = 0;
            r++;
            s = 0;
        }
        if (I == N-1 && r != N-1)
        {
            I = 0;
        }
    }
}
    原文作者:晟夏的叶
    原文地址: https://www.jianshu.com/p/6736a3237c4f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞