剑指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号栈中

 

算法和数据操作

面试题10.斐波那契数列

从下往上计算比从n开始递归效率更高

面试题11.旋转数组的最小数字

回溯法

面试题12.矩阵中的路径

面试题13.机器人的动态范围

动态规划与贪婪算法

面试题14.剪绳子

位运算

面试题15.二进制中1的个数

 

三、高质量的代码

面试题16.数值的整数次方

使用二分法进行计算、a^16 = a^8 * a^8

面试题17.打印从1到最大的n位数

关键在于会出现大数,所以使用字符串进行表示

面试题18.删除链表的节点

 

你可能感兴趣的:(剑指Offer 面试题)