日期:2014-05-20  浏览次数:20972 次

一道笔试题,要求两种解法
已知有Employee类,内有2属性:salary和EmployeeCollection(第二个是一个集合,存储其直接下属)。
现要求计算一个员工及其下属(直接和间接)的总工资。要求2中方式。我只知道一个递归的,另一种是什么?

------解决方案--------------------
递归还可以分前序、后序呢。

顺便说下出这种题目的公司绝对不是什么有作为的公司。
------解决方案--------------------
没想出来除了递归还有什么好办法。。
------解决方案--------------------
循环啊,用栈
------解决方案--------------------
ds.Tables["table1"].Compute("sum(salary)","").ToString();
db.Employee.Sum(p => p.salary);
db.Employee.Select(o => o.salary).Sum();

------解决方案--------------------
只想到一种递归的:
C# code
  decimal Salary(Employee e)
  {
    decimal s = e.salary;
    if (e.EmployeeCollection != null)
    {
      foreach (Employee x in e.EmployeeCollection)
      {
        s += Salary(x);
      }
    }
    return s;
  }

------解决方案--------------------
楼上的只计算了三层:本人、直接下属、直接下属的直接下属,第四层以后的都没有计算。
------解决方案--------------------
受8楼的启发,找到了不用递归的方法 TotalSalaryWithoutRecursion():
C# code
using System.Collections.Generic;

class Employee
{
  // 该员工本人的薪金
  public decimal salary;
  
  // 该员工的直接下属的集合
  public List<Employee> EmployeeCollection;
  
  // 该员工及其下属(直接和间接)的总薪金,递归的方法
  public decimal TotalSalary()
  {
    decimal s = salary;
    if (EmployeeCollection != null)
    {
      foreach (Employee x in EmployeeCollection)
      {
        s += x.TotalSalary();
      }
    }
    return s;
  }
  
  // 该员工及其下属(直接和间接)的总薪金,不用递归的方法
  public decimal TotalSalaryWithoutRecursion()
  {
    decimal s = salary;
    for (List<Employee> ec = EmployeeCollection; ec != null && ec.Count > 0; ec = SubCollection(ec))
    {
      foreach (Employee e in ec)
      {
        s += e.salary;
      }
    }
    return s;
  }
  
  // 返回员工集合 ec 中每个员工的直接下属组成的集合
  private List<Employee> SubCollection(List<Employee> ec)
  {
    List<Employee> list = new List<Employee>();
    foreach (Employee e in ec)
    {
      if (e.EmployeeCollection != null) list.AddRange(e.EmployeeCollection);
    }
    return list;
  }
}

------解决方案--------------------
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
------解决方案--------------------
..
------解决方案--------------------
lg
------解决方案--------------------
学习了,很不错
------解决方案--------------------
好东东,谢谢楼主
------解决方案--------------------
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
------解决方案--------------------
学习了
------解决方案--------------------
写一种 队列的方法
大概考这个呗
using System;
using System.Collections.Generic;
Queue<string> employeers = new Queue<string>();

public decimal totalSalary(employee person)
{
decimal totalSalary=0;
employeers.enqueue(person);
while(employeers.count>0)
{
totalSalary+=employeers.peek().salary;
if(employeers.peek().EmployeeCollection!=null)
{
foreach(employee e in employeers.peek().EmployeeCollection)
{
employeers.enqueue(e);
}
}
employeers.dequeue(employeers.peek());