面试题答案
一键面试关键实现步骤:
- 获取公司所有员工的工资数组。这需要遍历公司的
employees
数组以及每个部门的employees
数组,将所有员工的salary
提取出来形成一个新数组。 - 使用KVC的集合操作计算平均工资。通过
@avg
操作符对工资数组进行计算。
代码实现(以Objective - C为例):
// 假设Company类定义如下
@interface Company : NSObject
@property (nonatomic, strong) NSArray<Employee *> *employees;
@property (nonatomic, strong) NSArray<Department *> *departments;
@end
// Employee类定义如下
@interface Employee : NSObject
@property (nonatomic, assign) float salary;
@end
// Department类定义如下
@interface Department : NSObject
@property (nonatomic, strong) NSArray<Employee *> *employees;
@end
@implementation Company
- (float)calculateAverageSalary {
NSMutableArray *allSalaries = [NSMutableArray array];
// 先添加公司直接的员工工资
for (Employee *employee in self.employees) {
[allSalaries addObject:@(employee.salary)];
}
// 再添加各部门员工工资
for (Department *department in self.departments) {
for (Employee *employee in department.employees) {
[allSalaries addObject:@(employee.salary)];
}
}
NSNumber *averageSalary = [allSalaries valueForKeyPath:@"@avg.self"];
return averageSalary.floatValue;
}
@end
代码说明:
- 首先创建一个可变数组
allSalaries
来存储所有员工的工资。 - 通过嵌套循环,将公司直接管理的员工工资以及各部门员工工资添加到
allSalaries
数组中。 - 最后使用KVC的
@avg
操作符计算数组中所有工资的平均值,并返回该平均值。
如果是在Swift中实现:
class Employee {
var salary: Float
init(salary: Float) {
self.salary = salary
}
}
class Department {
var employees: [Employee]
init(employees: [Employee]) {
self.employees = employees
}
}
class Company {
var employees: [Employee]
var departments: [Department]
init(employees: [Employee], departments: [Department]) {
self.employees = employees
self.departments = departments
}
func calculateAverageSalary() -> Float {
var allSalaries: [Float] = []
allSalaries.append(contentsOf: employees.map { $0.salary })
for department in departments {
allSalaries.append(contentsOf: department.employees.map { $0.salary })
}
let sum = allSalaries.reduce(0, +)
return sum / Float(allSalaries.count)
}
}
Swift代码说明:
- 在Swift中,首先定义了
Employee
、Department
和Company
类。 - 在
Company
类的calculateAverageSalary
方法中,先通过map
将公司直接员工和各部门员工的工资提取出来组成一个数组allSalaries
。 - 然后通过
reduce
计算工资总和,并除以员工总数得到平均工资。这里没有直接使用KVC,因为Swift有更简洁的方式来完成类似操作,如果一定要在Swift中使用KVC来计算平均值,需要使用NSArray
和NSNumber
桥接,如下:
func calculateAverageSalaryWithKVC() -> Float {
var allSalaries: [NSNumber] = []
allSalaries.append(contentsOf: employees.map { NSNumber(value: $0.salary) })
for department in departments {
allSalaries.append(contentsOf: department.employees.map { NSNumber(value: $0.salary) })
}
let averageSalary = (allSalaries as NSArray).value(forKeyPath: "@avg.self") as! NSNumber
return averageSalary.floatValue
}
此方法先将Float
类型的工资数组转换为NSNumber
数组,然后使用KVC的@avg
操作符计算平均值。