面试知识总结——数据结构与算法

1. 红黑树相关问题

https://www.cnblogs.com/wuchanming/p/4444961.html

2.各种时间复杂度问题

https://www.cnblogs.com/zwtgyh/p/10631760.html
https://blog.csdn.net/chao2016/article/details/82425317

3.对比一下数组和链表的优缺点。

  • 数组:优点是支持随机访问,缺点是插入和删除效率低,内存空间要求高,必须有足够的连续内存空间。
  • 链表:优点是插入删除速度快,内存利用率高,不会浪费内存。缺点是不能随机查找。

4. 两个栈模拟队列怎么实现?

5. 快排的稳定性和时间复杂度,如何优化快排使得它稳定?

https://blog.csdn.net/liuchenjane/article/details/72902325

6. 快速排序是最快的排序算法吗?

7. 了解迪杰斯特拉算法吗?作用是什么?描述一下计算步骤。可以求得最优解吗?了解启发式搜索吗?

8. 迪杰斯特拉算法和A星算法?

https://blog.csdn.net/hitwhylz/article/details/41383561

9. 如何评价一个哈希函数的质量?发生冲突如何处理?

评价哈希函数优劣的因素有:

  • 能否将关键字均匀影射到哈希空间上,
  • 有无好的解决冲突的方法,
  • 计算哈希函数是否简单高效。

哈希冲突的解决方法包括:

  • 开放定址法(包括线行探查法,平方探查法等)
  • 链地址法
  • 再哈希法

10. 求top k的几种方法?

答:1)小顶堆的方法:O(nlogK) 的复杂度,如果 K 远小于 n 的话, O(nlogK) 其实就接近于 O(n) 了。优点是需要的内存比较小。
2)快排的 partition 划分:时间复杂度是 O(n),需要内存比较多。
参考 算法必学:经典的 Top K 问题

11.如何判断一个链表是否带环?

快慢指针法,详见《剑指Offer》

12.不使用第三个数交换两个数

void swap(int& a,int& b)  
{  
     a = a^b;  
     b = a^b;  
     a = a^b;  
}  

13.快排最坏情况什么时候出现?如何避免?

这个答案还得看枢轴(pivot)的选择策略。在快速排序的早期版本中呢,最左面或者是最右面的那个元素被选为枢轴,那最坏的情况就会在下面的情况下发生啦:

  • 数组已经是正序(same order)排过序的。
  • 数组已经是倒序排过序的。
  • 所有的元素都相同(1、2的特殊情况)

因为这些案例在用例中十分常见,所以这个问题可以通过要么选择一个随机的枢轴,或者选择一个分区中间的下标作为枢轴,或者(特别是对于相比更长的分区)选择分区的第一个、中间、最后一个元素的中值作为枢轴。有了这些修改,那快排的最差的情况就不那么容易出现了,但是如果输入的数组最大(或者最小元素)被选为枢轴,那最坏的情况就又来了。

14.手写快排

#include

//交换函数
void swap(int &a, int &b)
{
    int t = a;
    a = b;
    b = t;
}

int partition(int a[], int low, int high)
{
    int x = a[low];    //将该数组第一个元素设置为比较元素
    int i = low;    //指向数组头的指针
    int j = high;    //指向数组尾的指针
    while (i < j)
    {
        while (i < j && a[j] >= x)
            j--;    //从右至左找到第一个小于比较元素的数
        while (i < j && a[i] <= x)
            i++;    //从左至右找到第一个大于比较元素的数
        /*需要注意的是,这里的j--与i++的顺序不可以调换!
          如果调换了顺序,i会走过头,以至于将后面较大的元素交换到数组开头*/

        //将大数与小数交换
        if (i != j)
            swap(a[i], a[j]);
    }
    swap(a[low], a[i]);    //将比较元素交换到期望位置
    return i;    //返回比较元素的位置
}

void quicksort(int a[], int low, int high)
{
    if (low < high)
    {
        int i = partition(a, low, high);    //划分数组并获取比较元素的位置
        quicksort(a, low, i - 1);    //对比较元素左边进行排序
        quicksort(a, i + 1, high);    //对比较元素右边进行排序
    }
}

int main()
{
    int a[] = { 5,7,1,6,4,8,3,2 };
    int length = sizeof(a) / sizeof(a[0]);
    quicksort(a, 0, length - 1);
    for (int i = 0; i < length; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

你可能感兴趣的:(面试知识总结,数据结构与算法)