剑指Offer 面试题

面试题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号栈中

算法和数据操作

猜你喜欢

转载自blog.csdn.net/copy_07/article/details/81835460