习题和部分笔记来自数据结构与算法 (王桂林)
习题1:舞伴问题
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
问题分析:先入队的男士或女士也应该先出队成为舞伴(根据队列的思想),将男和女的记录存放在一个数组中作为输入,依次扫描各元素,根据性别决定进入男队列还是女队列,当两个队列构造完成后,依次将两队当前的队头元素作为输出进行配对,直至某个队列为空,此时,若某队仍有未匹配者,作为下一轮待匹配者。
题目链接 http://acm.swust.edu.cn/#/problem/1027/341 ( 可在线测试,来自SWUST OJ 1027)
第一行男士人数m和女士人数n(1<=m,n<=100);
第二行舞曲的数目k(1<=k<=100)。
input:
4
3
6
output:
1
1
2
2
3
3
4
1
1
2
2
3
# include<stdio.h>
int main()
{
int M[100];
int F[100];
int m, f, k;
scanf("%d%d", &m, &f);
scanf("%d", &k);
for (int i = 1; i <= m; i++)
M[i] = i;
for (int j = 1; j <= k; j++)
F[j] = j;
for (int i = 1; i <= k; i++)
{
if (i <= m)
{
printf("%d", M[i]);
}
else
{
if (i % m == 0)
{
printf("%d", M[m]);
}
else
{
printf("%d", M[i % m]);
}
}
if (i <= f)
{
printf("%d\n", F[i]);
}
else
{
if (i % f == 0)
{
printf("%d\n", F[f]);
}
else
{
printf("%d\n", F[i % f]);
}
}
}
}
习题2 广度优先搜索的实现 (类似题型 https://leetcode-cn.com/tag/breadth-first-search/)
习题3 实现树的层序遍历 (leetcode 102)
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
#include <vector>
#include <queue>
using namespace std;
#include <iostream>
void reverse_with_iterator(vector<vector<int>> vec);
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > levelOrder(TreeNode* root) {
// write code here
vector<vector<int> > res;
if (!root) return res;
queue<TreeNode*> qu;
qu.push(root);
while (!qu.empty()) {
int size = qu.size();
vector<int> vec;
while (size--) {
TreeNode* node = qu.front();
qu.pop();
vec.push_back(node->val);
if (node->left) qu.push(node->left);
if (node->right) qu.push(node->right);
}
if (vec.size() > 0) res.push_back(vec);
}
return res;
}
};
void reverse_with_iterator(vector<vector<int>> vec)
{
if (vec.empty())
{
cout << "The vector is empty!" << endl;
return;
}
vector<int>::iterator it;
vector<vector<int>>::iterator iter;
vector<int> vec_tmp;
cout << "Use iterator : " << endl;
for (iter = vec.begin(); iter != vec.end(); iter++)
{
vec_tmp = *iter;
for (it = vec_tmp.begin(); it != vec_tmp.end(); it++)
cout << *it << " ";
cout << endl;
}
}
int main()
{
TreeNode a, b, c,d,e;
TreeNode* root = &a;
a.val = 3;
b.val = 9;
c.val = 20;
d.val = 15;
e.val = 7;
a.left = &b;
a.right = &c;
b.left = &d;
b.right = &e;
c.right = NULL;
c.left = NULL;
d.right = d.left = e.right = e.left = NULL;
Solution A;
vector<vector<int> > resa;
resa = A.levelOrder(root);
reverse_with_iterator(resa);
return 0;
}
待续。。。