zoukankan      html  css  js  c++  java
  • 剑指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)的时间内查找某一元素。

  • 相关阅读:
    GIT SSH免登录密码实现更新(git pull)、推送(git push)操作
    Gulp新手入门教程
    常见的反爬虫的方式
    retrying模块的使用
    通过pyppeteer来爬取今日头条
    Selenium详解
    scrapy框架来爬取壁纸网站并将图片下载到本地文件中
    Elasticsearch简介
    使用scrapy框架来进行抓取的原因
    python(三):面向对象--类和实例
  • 原文地址:https://www.cnblogs.com/chengxuyuanxiaowang/p/4321895.html
Copyright © 2011-2022 走看看