我在最近的采访中遇到了以下C ++问题,但却无法做到。请帮忙。
考虑到公司结构,每个员工向上级报告,一直到CEO,您将如何打印出特定个人监督的所有员工?
编写一个实现此方法的方法,如下所示:
// Employee object contains a string denoting the.
// employee name, and an array containing
// employees who report to this employee
Employee {
String name;
Employee[] employees;
}
我已经看到并理解了递归函数。但我没有遇到像这样的递归对象/结构。
我的新问题是如何从这个类/结构创建和初始化对象,因为它是递归的? 再次感谢你。
答案 0 :(得分:3)
根据给出的信息,很难回答(问题可能应该暂停)。总之...
我认为递归方法就是答案。您需要一个可以获取名称的函数,在该完整的员工列表中搜索该名称,然后再次为本地数组中的每个员工调用该函数。类似的东西:
void doit(Employee& e)
{
// Print e.name
// For each employee tmp in e.employees (i.e. local array)
doit(tmp);
}
注意 - 这要求manager-employee数组中没有循环。如果有这将是一个无限循环。所以这是一种危险的方法。
这是由于OP的评论而添加的。
如上所述,问题含糊不清,并没有提供足够的信息来提供一个好的答案。问题中给出的结构不是有效的C ++,也没有描述如何维护公司的员工名单。
然而,为了简单起见,打印可能如下所示:
struct Employee
{
void PrintAllReportingEmployee(int level)
{
cout << string(4*level, ' ') << name << endl;
level++;
for (auto& e : employeesDirectlyReportingToThisEmployee)
{
e.PrintAllReportingEmployee(level);
}
}
string name;
vector<Employee> employeesDirectlyReportingToThisEmployee;
};
// Code in some print function:
// Step 1 - find the relevant employee
Employee tmp = SomeFunctionReturningAnEmployeeBasedOnName("NameOfPerson");
// Step 2 - print all employees reporting directly and indirectly
tmp.PrintAllReportingEmployee(0);
这假设一名顶级员工(例如董事)带有直接向董事报告的员工。然后,每个人都会有一个向他们报告的员工矢量等等。所以它是一种树状结构。
注意,如果我应该设计一个员工数据库,我就不会采用这样的解决方案。
答案 1 :(得分:-2)
曾经问过这个问题的人正在寻找与类继承有关的答案。所以Persion类是由Employee扩展的,其中Person也由Manager等扩展,在那里他们都共享一些类似的属性,但不是一切。
这意味着您的代码可以被其他程序员扩展,一个更改可以修复许多不同的类!
虽然这段代码没有演示类继承,但它可以正常工作。
/*
THE OUTPUT:
Jacobs-MacBook-Pro:~ jacob$ ./employee
Foo McGoo
Bar Too
Jacobs-MacBook-Pro:~ jacob$
*/
#include <iostream>
#include <string>
#include <vector>
using std::string;
using std::vector;
using std::cout;
using std::endl;
/* define class (this should be in a header file) */
class Employee{
public:
//Variables
string Name;
//Functions
Employee(const string&); //constructor
void AddCoWorker(const Employee&);
void ShowCoWorkers();
private:
vector<Employee> employees;
}; //Note the semicolon
//Entry point
int main(int argc, char **argv){
Employee foo("Foo McGoo");
Employee bar("Bar Too");
Employee me("Bevis");
me.AddCoWorker(foo);
me.AddCoWorker(bar);
me.ShowCoWorkers();
return 0;
}
//Class functions (should be in a separate cpp file)
Employee::Employee(const string& name){
this->Name = name;
}
void Employee::AddCoWorker(const Employee &e){
this->employees.push_back(e);
}
void Employee::ShowCoWorkers(){
int count = this->employees.size();
for(int i = 0; i < count; i++){
//Print the names of each co worker on separate lines
cout << this->employees[i].Name << endl;
}
}