剑指offer,靠谱分析及牛客网可AC代码,c++(51~60)

本文深入解析了多个经典算法问题,包括查找数组中的重复数字、构建乘积数组、正则表达式匹配、判断字符串是否表示数值、查找字符流中第一个不重复的字符、寻找链表中的环、删除链表中重复节点、定位二叉树的下一个节点、判断二叉树是否对称、以及多行打印二叉树等。通过具体实例和代码实现,提供了详尽的算法思路和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

51、数组中重复的数字
https://blog.youkuaiyun.com/malele4th/article/details/79333216
https://blog.youkuaiyun.com/derrantcm/article/details/46811855

class Solution {
public:
	bool duplicate(int numbers[], int length, int* duplication) {
		if (numbers == nullptr || length <= 1)
		{
			duplication = nullptr;
			return false;
		}
		for(int i=0;i<length;i++)
		{
			while (numbers[i] != i)
			{
				if (numbers[i] == numbers[numbers[i]])
				{
					*duplication = numbers[i];
					return true;
				}
				int temp = numbers[i];
				numbers[i] = numbers[temp];
				numbers[temp] = temp;
			}
		}
		return false;
	}
};

52、构建乘积数组
https://blog.youkuaiyun.com/malele4th/article/details/79333223
https://blog.youkuaiyun.com/derrantcm/article/details/46825625

class Solution {
public:
	vector<int> multiply(const vector<int>& A) {
		vector<int> vec;
		int size = A.size();
		if (size == 0) return vec;
		vec.push_back(1);
		for (int i = 0; i < size-1; i++)
			vec.push_back(vec.back()*A[i]);
		int temp = 1;
		for (int i = size - 1; i >= 0; i--)
		{
			vec[i] *= temp;
			temp *= A[i];
		}
		return vec;
	}
};

53、正则表达式匹配
https://blog.youkuaiyun.com/malele4th/article/details/79334727
https://blog.youkuaiyun.com/derrantcm/article/details/46825653

class Solution {
public:
	bool match(char* str, char* pattern)
	{
		if (*str == '\0'&&*pattern == '\0') return true;
		if (*str != '\0'&&*pattern == '\0') return false;
		
		if (*(pattern + 1) != '*')
		{
			if (*str == *pattern || (*str != '\0'&&*pattern == '.'))
				return match(str + 1, pattern + 1);
			else return false;
		}
		else 
		{
			if (*str == *pattern || (*str != '\0'&&*pattern == '.'))
				return match(str, pattern + 2) || match(str + 1, pattern);
			else
				return match(str, pattern + 2);
		}
	}
};

54、表示数值的字符串
https://blog.youkuaiyun.com/malele4th/article/details/79334763
https://blog.youkuaiyun.com/derrantcm/article/details/46825671

class Solution {
public:
    bool isNumeric(char* str)
    {
        bool sign=false,decimal=false,hase=false;
        for(int i=0;i<strlen(str);i++)
        {
                if(str[i]=='e'||str[i]=='E')
                        {
                                if(i==strlen(str)-1)return false;
                                if(hase) return false;
                                hase=true;
                        }
                else if(str[i]=='+'||str[i]=='-')
                        {
                                if(sign&&str[i-1]!='e'&&str[i-1]!='E') return false;
                                if(!sign&&i>0&&str[i-1]!='e'&&str[i-1]!='E')return false;//or if(i!=0&&str[i-1]!='e'&&str[i-1]!='E') return false;
                                sign=true;
                        }
                else if(str[i]=='.')
                        {       
                                if(hase||decimal) return false;
                                decimal=true;
                        }
                else if(str[i]<'0'||str[i]>'9')return false;
        } 
        return true;
    }

};

55、字符流中第一个不重复的字符(hash表
https://blog.youkuaiyun.com/malele4th/article/details/79334816
https://blog.youkuaiyun.com/derrantcm/article/details/46838825

class Solution
{
public:
	string str;
	char hash[256] = {0};//“={0}”可不加
	void Insert(char ch)
	{
		str += ch;
		hash[ch]++;
	}
	char FirstAppearingOnce()
	{
		int size = str.size();
		for (int i = 0; i < size; i++)
		{
			if (hash[str[i]] == 1) return str[i];
		}
		return '#';
	}
};

56、链表中环的入口结点:
https://blog.youkuaiyun.com/malele4th/article/details/79334922
https://blog.youkuaiyun.com/derrantcm/article/details/46838835

class Solution {
public:
	ListNode* EntryNodeOfLoop(ListNode* pHead)
	{
		ListNode *p1 = pHead;
		ListNode *p2 = pHead;
		while (p2 != nullptr&&p2->next != nullptr)
		{
			p1 = p1->next;
			p2 = p2->next->next;
			if (p1 == p2) {
				p2 = pHead;
				while (p1 != p2)
				{
					p1 = p1->next;
					p2 = p2->next;
				}
				return p1;
			}
		}
		return nullptr;
	}
};

57、删除链表中重复的结点
https://blog.youkuaiyun.com/malele4th/article/details/79335015
https://blog.youkuaiyun.com/derrantcm/article/details/46847909

class Solution {
public:
	ListNode* deleteDuplication(ListNode* pHead)
	{
		if (pHead == nullptr)return nullptr;
		if (pHead != nullptr&&pHead->next == nullptr)return pHead;

		ListNode *cur = pHead;
		if (cur->next->val == cur->val)
		{
			cur = cur->next->next;
			while (cur != nullptr&&cur->val == pHead->val)
				cur = cur->next;
			return deleteDuplication(cur);
		}
		else {
			cur = cur->next;
			pHead->next = deleteDuplication(cur);
			return pHead;
		}
	}
};

58、二叉树的下一个结点:
https://blog.youkuaiyun.com/malele4th/article/details/79335019
https://blog.youkuaiyun.com/derrantcm/article/details/46847919

class Solution {
public:
	TreeLinkNode* GetNext(TreeLinkNode* pNode)
	{
		if (pNode == nullptr) return nullptr;

		if (pNode->right != nullptr) {
			pNode = pNode->right;
			while (pNode->left != nullptr)
			{
				pNode = pNode->left;
			}
			return pNode;
		}

		while (pNode->next != nullptr)
		{
			TreeLinkNode *p = pNode->next;
			if (p->left == pNode) return p;
			pNode = pNode->next;
		}
		return nullptr;
	}
};

59、对称的二叉树:
https://blog.youkuaiyun.com/malele4th/article/details/79335103
https://blog.youkuaiyun.com/derrantcm/article/details/46847939

class Solution {
public:
	bool isSymmetrical(TreeNode* pRoot)
	{
		if (pRoot == nullptr)return true;
		return issame(pRoot->left, pRoot->right);
	}

	bool issame(TreeNode *p1, TreeNode *p2)//子函数
	{
		if (p1 == nullptr&&p2 == nullptr) return true;
		if (p1 == nullptr&&p2 != nullptr) return false;
		if (p1 != nullptr&&p2 == nullptr) return false;

		if (p1->val == p2->val)
			return issame(p1->left, p2->right) && issame(p1->right, p2->left);
		else 
			return false;
	}
};

60、把二叉树打印成多行
https://blog.youkuaiyun.com/malele4th/article/details/79335406
https://blog.youkuaiyun.com/derrantcm/article/details/46857911
可对比“判断是否为全二叉树”

class Solution {
public:
	vector<vector<int>> Print(TreeNode* pRoot) {
		vector<vector<int>> res;
		if (pRoot == nullptr)return res;
		queue<TreeNode*>que;
		que.push(pRoot);
		while (!que.empty())
		{
			vector<int>vec;
			int size = que.size();
			for (int i = 0; i < size; i++)
			{
				TreeNode *temp = que.front();
				vec.push_back(temp->val);
				que.pop();
				if (temp->left != nullptr) que.push(temp->left);
				if (temp->right != nullptr) que.push(temp->right);
			}
			res.push_back(vec);
		}
		return res;
	}

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值