面试题1.赋值运算符函数
CMyString& operator= (const CMyString& other) // 返回引用考可以做到连续赋值 str1 = str2 = str3;若返回void,只能赋值一次
{
if (this == &other) // 若相同的字符串,那么地址也是相同的
{
return *this;
}
delete[]pData_; //将原来的内存释放掉
pData_ = nullptr; //
pData_ = new char[strlen(other.pData_) + 1]; // strlen从内存头开始遍历,到'\0'结束的大小
strcpy(pData_, other.pData_);
return *this;
}
面试题2.实现Singleton实例
1.条件:只能创建一个实例(构造函数私有) + static
// 单例模式:双重检查
// 构造函数私有 + 双重检查
class Singleton
{
private:
Singleton();
public:
static Singleton *instance;
static Singleton Instance() {
if (instance == nullptr) {
//
ACE_Mutex();
if (instance == nullptr) {
instance = new Singleton;
}
}
return *instance;
}
};
数组
面试题3.数组中重复的数字
哈希法
面试题4.二维数组中的查找
从右上角开始遍历
字符串
面试题5.替换空格
1)原地算法:算好空格替换后的长度,然后从后往前开始替换(也是相当于开辟新的数组),可以减少移动数
2)再创建一个数组搬运,复杂度也不高
链表
面试6.从尾到头打印链表
遍历一遍,将结果暂时存在栈中
Ps:其他题目
1)求链表的中间节点
2)求一条链表是否有环,且求入环的节点(先快慢指针找到相遇点,再从起点和相遇点同时以1步速度遍历,再次相遇即为入环节点)
3)求两条链表是否相交
将A的尾连到B的头上,再从B开始进行快慢指针判断是否有环
4)求两个链表的交点
求A的长度,再求B的长度
哪个链表长,就根据A和B的长度差进行移动,这样两个链表起点想同了,此时同时移动就可以求得交点
5)求倒数第k个节点
树
面试题7.重建二叉树
根据中序遍历+前序遍历/后序遍历获得二叉树
解法:从前序遍历可以获得根,再根据根将中序遍历分成左右两段并且知道左右的数量,可以构造一个TreeNode,进而递归构造
面试题8.二叉树的下一个节点
通过中序遍历的特点:
1)若节点带右子树,那么下一个节点是右子树的最左节点;
2)若节点没有右子树,且此节点是父节点的左子节点,那么下一个节点是父节点;
3)若节点没有右子树,且此节点是父节点的右子节点,沿着父节点的指针往上遍历,若找到一个节点是父节点的左节点,那么那么下一个节点是此父节点。
栈和队列
面试题9.用两个栈实现队列
1号栈专门用来作为push用;
2号栈专门用来作为pop,当空时,将1号栈按顺序压入2号栈中
算法和数据操作
面试题10.斐波那契数列
从下往上计算比从n开始递归效率更高
面试题11.旋转数组的最小数字
回溯法
面试题12.矩阵中的路径
面试题13.机器人的动态范围
动态规划与贪婪算法
面试题14.剪绳子
位运算
面试题15.二进制中1的个数
三、高质量的代码
面试题16.数值的整数次方
使用二分法进行计算、a^16 = a^8 * a^8
面试题17.打印从1到最大的n位数
关键在于会出现大数,所以使用字符串进行表示
面试题18.删除链表的节点