c++面试经典编程试题

版权声明:版权归原作者所有。未经允许,严禁转载。 https://blog.csdn.net/luccao/article/details/82425606

1. 二分查找

二分查找也是比较经典的面试题
条件:
1)数据是按从小到大或者是从大到小排序的
2)给定一组数据,在所给的排序数据中找出与数据相等的值,并返回它的下标

例子代码:

#include <iostream>
using namespace std;

int binary_search(int *a, int num, int value);

/*二分查找函数*/
int binary_search(int *a, int num, int value)
{
    int start = 0;
    int end = num - 1;
    while(start <= end)
    {
        int mid = start + ((end - start) >> 1);
        if(a[mid] < value)
        {
            start = mid + 1
        }
        else if(a[mid] > value)
        {
            end = mid - 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}

/*主函数*/
int main(int argc, char **argv)
{
    int a[] = {1,2,3,4,5};
    int num = 5;
    int value = 3;
    int index = binary_search(a, num, value);
    printf("index = %d\n", index);
}

2. 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点, 只调整指针的指向

这里写图片描述

解题思路
当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。
步骤:
1)创建二元查找树
2)将二元查找树转换成双向链表
3)遍历二元查找树

/*定义二元查找树节点结构*/
typedef struct _BSTreeNode{
    int data;
    struct _BSTreeNode *left;
    struct _BSTreeNode *right;
}BSTreeNode;

/*转换子二叉查找树变成排序双向链表*/
BSTreeNode* ConvertNode(BSTreeNode *pNode, bool asRight)
{
    if(pNode == NUll)
    {
        return;
    }
    //左子树链表
    BSTreeNode *pleft = NULL;
    //右子树链表
    BSTreeNode *pright = NULL;
    //1. 返回左子链表的最大值给当前node
    if(pNode->left)
    {
        pleft = ConvertNode(pNode->left, false);
    }
    if(pleft)
    {
        pleft->right = pNode;
        pNode->left = pleft; 
    }
    //2. 返回右子链表的最小值给当前node
    if(pNode->right)
    {
        pright = ConvertNode(pNode->right, true);
    } 
    if(pright)
    {
        pright->left = pNode;
        pNode->right = pright;
    }
    BSTreeNode *p_temp = pNode;
    if(asRight)
    {
        while(p_temp->left)
        {
            p_temp = p_temp->left;
        }
    }
    else
    {
        while(p_temp->right)
        {
            p_temp = p_temp->right;
        }
    }
    return p_temp;
}

/*转换二叉查找树变成排序双向链表*/
BSTreeNode* Convert(BSTreeNode *p_headoftree)
{
    return ConvertNode(p_headoftree, true);
}

3. 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数 min、push 以及 pop的时间复杂度都是O(1)。

思路:
1. 什么是栈?
这里写图片描述
2. 回想一下栈的结构,然后再看看题目,似乎觉得还是很有难度。
经过一番苦想,思路可以是一下这种:

这里写图片描述

#include <deque>
#include <assert.h>
#include <iostream>
using namespace std;

template <typename T> 
class CStackWithMin
{

}

猜你喜欢

转载自blog.csdn.net/luccao/article/details/82425606
今日推荐