《剑指Offer》题一~题十
Posted xzxl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer》题一~题十相关的知识,希望对你有一定的参考价值。
一、赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString { public: CMyString(char *pData = nullptr); CMyString(const CMyString &str); ~CMyString(); private: char *m_pData; };
测试用例:
- 把一个CMyString的实例赋值给另外一个实例。
- 把一个CMyString的实例赋值给它自己。
- 连续赋值。
没有考虑异常安全性的解法:
CMyString& CMyString::operator=(const CMyString &rhs) { if(this != &rhs) { delete []m_pData; m_pData = nullptr; m_pData = new char[strlen(rhs.m_pData) + 1]; strcpy(m_pData, rhs.m_pData); } return *this; }
考虑异常安全性的解法:
CMyString& CMyString::operator=(const CMyString &rhs) { if(this != &rhs) { CMyString strTemp(rhs); // 创建一个临时实例strTemp /* 交换strTemp.m_pData和实例自身的m_pData */ char *pTemp = m_pData; m_pData = strTemp.m_pData; strTemp.m_pData = pTemp; } /* 自动调用strTemp的析构函数,释放strTemp.m_pData指向的新内存 */ return *this; }
补:在新的代码中,我们在CMyString的构造函数里用new分配内存,故如果内存不足将抛出诸如bad_alloc等异常,但由于我们还没有修改实例自身的状态,故实例的状态还是有效的,这也就保证了异常安全性。
考点:
- C++基础语法,如运算符函数、常量引用等。
- 内存泄露。
- 代码异常安全性。
二、实现Singleton(单例)模式
题目:设计一个类,我们只能生成该类的一个实例。
解读题意:只能生成一个实例的类是实现了Singleton模式的类型。
考点:
- 单例模式
- C#基础语法,如静态构造函数等。
- 多线程编程。
三、数组中重复的数字
题目一:找出数组中重复的数字。
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
题目二:不修改数组找出重复的数字。
在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。
四、在二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
以上是关于《剑指Offer》题一~题十的主要内容,如果未能解决你的问题,请参考以下文章