技术类面试要点梳理

2016-10-12  本文已影响43人  大唐的魔法师

未完待续==

一、数据结构与算法

1. 排序

排序
void InsertSort(int *a, int n)
{
    int temp;

    for(int i=1; i<n; i++)
    {
        temp = a[i];   //即将新插入的值
        for (int j=i; j>0 && a[j-1]>temp; j--)
            a[j] = a[j-1]; //元素依次向后移动
        a[j] = temp;  //插入空挡
    }
}
void SelectSort(int *a, int n)
{
    for(int i=0; i<n; i++)
    {
        int min = i;    //先赋值每趟的开始位置为最小
        for (int j=i+1; j<n; j++)
        {
            if(a[j]<a[min])
                min = j;       //时刻更新最小位置
        }
        if(i!=min)
            swap(a[i], a[min]);   
    }
}
void BubbleSort(int *a, int n)
{
    for (int i=0; i<n; i++)
    {
        for(int j=i+1; j<n; j++)
        {
            if(a[i]>a[j])
                swap(a[i], a[j]);
        }
    }       
}
//partition函数
int partition(int *a, int left, int right)
{
    int temp = a[left];   //为方便起见,最左边元素为枢纽。其实是不科学的

    while(left<right)
    {
        while(left<right && a[right]>temp)
            -- right;    //若右侧元素比枢纽元素值大,则继续向左查找
        a[left] = a[right];    //一旦查找到比枢纽元素小的值,则交换到左边(枢纽)位置

        while(left<right && a[left]<=temp)
            ++ left;
        a[right] = a[left];
    }

    a[left] = temp;  //将枢纽插入空位
    return left; //返回枢纽位置
}
//quicksort函数
void QuickSort(int *a, int left, int right)
{
    int pivot;

    if(left>=right) return;
    
    pivot = partition(a, left, right);
    QuickSort(a, left, pivot-1);
    QuickSort(a, pivot+1, right);
}

2. 二分查找

//不使用递归
int binarySearch(int arry[], int len, int value)
{
    if(arry==NULL||len<=0)
        return -1;

    int start=0;
    int end=len-1;

    while(start<=end)
    {
        int mid=start+(end-start)/2;
        if(arry[mid]==value)
            return mid;
        else if(value<arry[mid])
            end=mid-1;
        else
            start=mid+1;
    }
    return -1;
}
//不要传参,传引用调用,减少垃圾。
int binarySearchRecursion(int arry[], int value, int start, int end)
{
    if(start>end)
        return -1;

    int mid=start+(end-start)/2;
    if(arry[mid]==value)
        return mid;
    else if(value<arry[mid])
        return binarySearchRecursion(arry,value,start,mid-1);
    else
        return binarySearchRecursion(arry,value,mid+1,end);
}

二、操作系统

高效面试之操作系统常考题

  1. 进程和线程的区别
  1. 进程的状态
    进程的三种状态及转换
    运行状态,阻塞状态,就绪状态。
    进程状态转换图
    创建和退出不是进程的状态。阻塞和就绪的区别:阻塞是等待除CPU以外的资源,而就绪等待的是CPU资源。
  1. 进程通信的几种方式
    linux系统下:
  1. 线程同步几种方式。(一定要会写生产者、消费者问题,完全消化理解)

  2. 线程的实现方式。 (也就是用户线程与内核线程的区别)

  1. 死锁
    是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

c++基础知识

C++面试题——基础概念篇
C++面试出现频率最高的30道题目(一)
C++面试出现频率最高的30道题目(二)
C++面试出现频率最高的30道题目(三)

  1. static
  1. const
    修饰的内容不可改变,包括const数据成员,const参数,const返回值,const成员函数。被修饰的东西会被强制保护,可以预防意外变动,提高程序的健壮性。
  2. 宏#define和const关键字的区别
  1. C++中引用和指针的区别
    引用是对象的别名, 操作引用就是操作这个对象, 必须在创建的同时有效得初始化(引用一个有效的对象, 不可为NULL), 初始化完毕就再也不可改变, 引用具有指针的效率, 又具有变量使用的方便性和直观性, 在语言层面上引用和对象的用法一样, 在二进制层面上引用一般都是通过指针来实现的, 只是编译器帮我们完成了转换。 之所以使用引用是为了用适当的工具做恰如其分的事, 体现了最小特权原则。
  2. C与C++的内存分配方式
  1. 面向对象程序设计的优点
    开发时间短, 效率高, 可靠性高。面向对象编程的编码具有高可重用性,可以在应用程序中大量采用成熟的类库(如STL),从而虽短了开发时间,软件易于维护和升级。

数据库

https://www.zhihu.com/question/19552975/answer/123523074
数据库基础知识复习

索引:帮助MySQL高效获取数据的数据结构。 B-Tree和B+Tree。

计算机网络

上一篇 下一篇

猜你喜欢

热点阅读