剑指offer第2章学习(2)

d第2章还有很多要注意的问题,以下知识点需要重点注意

  1. C++面向对象的特性
  2. 构造函数
  3. 析构函数
  4. 动态绑定
  5. 运算符重载
  6. 常量引用
  7. 设计模式
  8. UML图
  9. C++对内存的使用管理
  10. 字符串的处理
  11. 冰法控制
  12. 复杂度的计算
  13. 文件操作
  14. 程序性能
  15. 多线程
  16. 程序安全

 

 

各种排序算法都有各自的使用范围。例如快速排序,如果数组本身已经排好序了,那么再使用它进行排序工作量为 O(n^2)。

面试之中最常用的数据结构有:

  1. 数组
  2. 字符串
  3. 链表(最常用)
  4. 树(最常用)
  5. 队列(和广度优先算法紧密相关)
  6. 栈(和递归紧密相关)
2.4算法和数据操作

重点掌握的3种算法

  1. 二分查找
  2. 归并排序
  3. 快速排序
//对公司所有员工的年龄进行排序
//假定,所有员工的年龄从15岁到60岁不等
//非常简单,没什么可说的
void SortAge(int data[], int length)
{
    
    const int Youngest = 15, Oldest = 60;

    if (data == NULL || length <= 0)
        return;

    int Age[Oldest - Youngest + 1];

    for (int i = Youngest; i <= Oldest; ++i)
    {
        Age[i] = 0;
    }

    for (int i = 0; i < length; ++i)
    {
        int age = data[i];
        if (age<Youngest || age>Oldest)
            throw exception("age out of range");
        Age[age]++;
    }

    int index = 0;
    for (int i = Youngest; i < Oldest; ++i)
    {
        for (int j = 0; j < Age[i]; j++)
        {
            data[index++] = i;
        }
    }
}

 

 
//面试题8 找到数组中的最小数字int Min(int num[], int length)
{
    
    if (num == NULL || length <= 0)
        throw exception("Invalid Input");

    int index1 = 0;
    int index2 = length - 1;
    int indexmid = index1;

    while (num[index1] >= num[index2])
    {
        if (index2 - index1 == 1)
        {
            indexmid = index2;
            break;
        }

        indexmid = (index1 + index2) / 2;

        if (num[indexmid] >= num[index1])
            index1 = indexmid;
        else if (num[indexmid] <= num[index2])
            index2 = indexmid;
    }

    return num[indexmid];
}

 

面试题9:斐波那契数列,虽然是一个递归的典型例子,但是在递归的过程中,重复计算的内容太多,反而用循环就可以轻松解决这个问题。

int Fibonacci(int n)
{
    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    int IndexNew=1;
    int IndexOld=1;
    int result=1;
    for (int i = 1; i < n; ++i)
    {
        IndexOld = IndexNew;
        IndexNew = result;
        result = IndexNew + IndexOld;
    }
    return result;
}

那么就再接着做一做扩展题目。发现仍然是一道典型的斐波那契数列解法的题目。代码我完全一样。就不再写了。

2.4.3 位运算

在位运算中,有左移和右移的情况,右移的情况稍微复杂一些。如果本来该数是正数的话,右移的时候空位补0,如果为负数的话,那么空位就补1。

除法的效率比位运算要低得多。能用位运算的时候要尽可能的用位运算。

哈希表和二叉排序树查找的重点在于考察对应的数据结构。

哈西白哦能够在O(1)的时间内查找某一元素。

posted @ 2015-03-08 16:51  程序员小王  阅读(262)  评论(0编辑  收藏  举报