《剑指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》题一~题十的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer》题一~题十

剑指offer28题

剑指offer中经典的算法题之从头到尾打印链表

剑指Offer系列之题11~题15

剑指 offer 刷题记录

剑指 Offer-动态规划解礼物的最大价值