//层级关系,任意给两个元素,找到最近的、公共的上一级
boss
membera1 members membera3
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)NSArray *Bill;
@property (nonatomic,strong)NSArray *Dom;
@property (nonatomic,strong)NSArray *Samir;
@property (nonatomic,strong)NSArray *Michael;
@property (nonatomic,strong)NSArray *Bob;
@property (nonatomic,strong)NSArray *Peter;
@property (nonatomic,strong)NSArray *Porter;
@property (nonatomic,strong) NSArray *Flisa;
@property (nonatomic,strong)NSArray *Milton;
@property (nonatomic,strong)NSArray *Nina;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//每个数组代表一个人,数组内包含它的下属,
#pragma mark: 注意:数组的第一个元素是自己的名字,遍历数组时,从 i=1开始
//最底层
self.Nina =@[@"Nina"];
self.Milton =@[@"Milton"];
//上一层
self.Bob =@[@"Bob"];
self.Peter =@[@"Peter",self.Nina,self.Milton];
self.Porter =@[@"Porter"];
self.Flisa =@[@"Flisa"];
//上一层
self.Dom =@[@"Dom",self.Bob,self.Peter,self.Porter];
self.Samir =@[@"Samir"];
self.Michael =@[@"Michael",self.Flisa];
//最顶层
self.Bill =@[@"Bill",self.Dom,self.Samir,self.Michael];
//从顶层开始往下检索,第一次调用这个方法时,HigerManager参数必须用 self.Bill
NSArray *closest = [selfclosestCommonManagerByMember1:self.NinaMember2:self.MichaelHigherManager:self.Bill];
//打印名字,看结果是否正确
NSLog(@"%@", closest.firstObject);
}
#pragma mark:执行这个方法
- (NSArray *)closestCommonManagerByMember1:(NSArray *)member1 Member2:(NSArray *)member2 HigherManager:(NSArray *)manager{
BOOL contains1 = [manager containsObject:member1];
BOOL contains2 = [manager containsObject:member2];
BOOL special1 = [selfmanager:member1containsMember:member2];
BOOL special2 = [selfmanager:member2containsMember:member1];
if (special1) {
return member1;
}
if (special2) {
return member2;
}
//manager至少直接包含其中一个(只是“父子”关系),两个member不存在包含关系
if (contains1 || contains2) {
return manager;
}
//manager两个都不直接包含
for (int i=1; i<manager.count; i++) {
BOOL containsForPath1 = [selfmanager:manager[i]containsMember:member1];
BOOL containsForPath2 = [selfmanager:manager[i]containsMember:member2];
//两个member都不在这条分支上
if (!containsForPath1 && !containsForPath2) {
continue;
}
//两个member都在这条分支上
if (containsForPath1 && containsForPath2) {
return [selfclosestCommonManagerByMember1:member1Member2:member2HigherManager:manager[i]];
}
//只有一个member在这条分支上
return manager;
}
return nil;
}
//判断 manager当中是否包含 member,(member可以是manager的儿子,也可以是孙子,也可以是重孙子.....)
- (BOOL)manager:(NSArray *)manager containsMember:(NSArray *)member {
if (manager.count <=1) {
return false;
}
if ([manager containsObject:member]) {
return true;
}
BOOL contains = false;
for (int i=1; i<manager.count; i++) {
contains = contains || [self manager:manager[i] containsMember:member];
}
return contains;
}
@end