d第2章还有很多要注意的问题,以下知识点需要重点注意
- C++面向对象的特性
- 构造函数
- 析构函数
- 动态绑定
- 运算符重载
- 常量引用
- 设计模式
- UML图
- C++对内存的使用管理
- 字符串的处理
- 冰法控制
- 复杂度的计算
- 文件操作
- 程序性能
- 多线程
- 程序安全
各种排序算法都有各自的使用范围。例如快速排序,如果数组本身已经排好序了,那么再使用它进行排序工作量为 O(n^2)。
面试之中最常用的数据结构有:
- 数组
- 字符串
- 链表(最常用)
- 树(最常用)
- 队列(和广度优先算法紧密相关)
- 栈(和递归紧密相关)
2.4算法和数据操作
重点掌握的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)的时间内查找某一元素。