剑指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);
}