剑指offer每日六题---------day three

剑指offer题13:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,是所有的奇数位于数组的前半部分,
             所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

   方法一:用辅助数组         方法二:两个奇数指针包夹着偶数,然后把这些偶数向后推一步,再把后面的一个奇数放到前面;重复步骤直到结束

#include<vector>
void ReSortArray(vector<int> &v)
{
	vector<int> even_store;
	even_store.reserve(v.size());

	int oddp = 0, evenp = 0;
	while (evenp < v.size())
	{
		if (v[evenp] & 0x01)//是奇数就往源数组的前面挪
			v[oddp++] = v[evenp];
		else
			even_store.push_back(v[evenp]);//否则先存起来

		++evenp;
	}
	for (size_t i = 0; i < even_store.size(); ++i)//把存在辅助数组的偶数挪回来
		v[oddp++] = even_store[i];
}

 

剑指offer题14:输入一个单链表,输出该链表中倒数第k个结点。

FlistNode *SingLinkList(FlistNode * head, size_t k)
{
	FlistNode *slow = head, *fast = head;

    //有时候下面三句代码可以不要,当k值大于该链表长度时直接返回NULL(或以出错形式返回)
	int count = 0;//用来计算链表中到底有多少个结点
	while (fast){ ++count; fast = fast->next; }
	k %= count + 1;//ps,如果k的值大于count时,修正k的值是十分有必要的,

	fast = head;
	while (k--)fast = fast->next;//这里不用判断fast是否为空,因为前面修正了k的值

	while (fast)
	{
		slow = slow->next;
		fast = fast->next;
	}
	return slow;
}

 

剑指offer题15:输入一个单链表,反转链表后,输出链表的所有元素。

void ReverseSinglyLinkList(FlistNode *head)
{
	FlistNode *prev = NULL, *cur = head, *next = NULL;
	if (cur)next = cur->next;

	while (cur)//逆置单链表
	{
		cur->next = prev;

		prev = cur;
		cur = next;
		if (next)next = next->next;
	}

	while (prev)
	{
		cout << prev->val << " ";
		prev = prev->next;
	}cout << endl;
}

 

剑指offer题16:输入两个单调递增的单链表,输出合并后的链表,使之满足单调不减规则。

FlistNode *MergeTwoSinglyList(FlistNode *head1, FlistNode *head2)
{
	if (!head1)return head2;//head1为空,直接返回head2
	if (!head2)return head1;//同理

	FlistNode *sma = head1, *big = head2;
	if (sma->val > big->val){ swap(sma, big); head1 = sma; }

	while (sma && big)//由于上面的操作,small->_val一定小于big->_val;
	{
		FlistNode *next;

		while (sma->next && sma->next->val <= big->val)
			sma = sma->next;//找到合适的位置

		next = big->next;

		big->next = sma->next;
		sma->next = big;

		sma = sma->next;//且在循环中一直保证small->_val小于big->_val.
		big = next;
	}
	return head1;
}

 

剑指offer题17:输入两棵二叉树A,B,判断B是不是A的子结构(ps:约定空树不是任意一棵树的子结构)

bool HasSubtree(TreeNode *rootA,TreeNode *rootB)
{
	//刚进来的时候,rootA->_val一定等于rootB->_val
	if (!rootB)return true;

	return (rootA && rootA->val == rootB->val)
		&& HasSubtree(rootA->left, rootB->left)
		&& HasSubtree(rootA->right, rootB->right);
}
bool IsSubtree(TreeNode *rootA,TreeNode *rootB)
{
	if (!rootA || !rootB)return false;

	bool flag = false;
	if (rootA->val == rootB->val)
		flag = HasSubtree(rootA, rootB);

	return flag ? true : IsSubtree(rootA->left, rootB) || IsSubtree(rootA->right, rootB);
}

 

剑指offer题18:操作给定的二叉树,将其变换为源二叉树的镜像

void MirrorBinaryTree(TreeNode *root)
{
	if (!root)return;

	swap(root->left, root->right);
	MirrorBinaryTree(root->left);
	MirrorBinaryTree(root->right);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值