一面就凉凉了…一道中等难度的深度优先搜索题死活想不出来,无语了啊,其实还是不熟的原因,只能说技不如人还有很长的路要走,权当涨见识了
我尝试把题目回忆了一下:
“微服务”-在拥挤的软件体系结构大街上的又一个新名词。尽管我们的天性是轻蔑地掠过这些事物,但是这种术语描述了一种越来越受欢迎的软件系统样式。在过去的几年中,我们已经看到许多项目都使用这种样式,到目前为止,结果是非常积极的,以至于对于我们的许多同事来说,这已成为构建企业应用程序的默认样式。但是,令人遗憾的是,没有太多信息可以概述微服务风格是什么以及如何实现。
简而言之,微服务架构样式[1]是一种将单个应用程序开发为一组小服务的方法,每个小服务都在自己的进程中运行并与轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务功能构建,并且可以由全自动部署机制独立部署。这些服务的集中管理几乎没有,可以用不同的编程语言编写并使用不同的数据存储技术。
目前,微软sharepoint组开始重构项目,并使用微服务技术,现在给出一些dll以及它的依赖,请你将这些dll组件合理的划分成几个组.
例如:
stswel.dll 依赖 onetutil.dll, a.dll, b.dll, c.dll
onetutil.dll 依赖 a.dll, b.dll, c.dll, d.dll
owssvr.dll 依赖 killswitch.dll,a.dll b.dll,e.dll, f.dll
killswitch.dll 依赖 e.dll, f.dll
划分成: [stswel.dll, onetutil.dll], [owssvr.dll, killswitch.dll]两组
输入:
shippingFiles = [stswel.dll, onetutil.dll, owssvr.dll, killswitch.dll]
dependencies= (stswel.dll, [onetutil.dll, a.dll, b.dll, c.dll]), (onetutil.dll, [a.dll, b.dll, c.dll, d.dll]),
(owssvr.dll, [killswitch.dll,a.dll b.dll,e.dll, f.dll]), (killswitch.dll, [e.dll, f.dll])
函数:
List<List> FindIndependentComponents(List shippingFiles, Dictionary<string, List> dependencies){
// write your code
}
List<string> shippingFiles = new List<string>() { "stswel.dll", "onetutil.dll", "owssvr.dll", "killswitch.dll" };
Dictionary<string, List<string>> dependencies = new Dictionary<string, List<string>>();
dependencies.Add("stswel.dll", new List<string>() { "onetutil.dll", "a.dll", "b.dll", "c.dll"});
dependencies.Add("onetutil.dll", new List<string>() { "a.dll", "b.dll", "c.dll", "d.dll" });
dependencies.Add("owssvr.dll", new List<string>() { "killswitch.dll" , "a.dll", "b.dll", "e.dll", "f.dll" });
dependencies.Add("killswitch.dll", new List<string>() { "e.dll", "f.dll" });
List<List<string>> results = FindIndependentComponents(shippingFiles, dependencies);
for(int i = 0; i < results.Count; i++)
{
for(int j=0;j< results[i].Count; j++)
{
Console.Write(results[i][j]+" ");
}
Console.WriteLine();
}
List<List<string>> FindIndependentComponents(List<string> shippingFiles, Dictionary<string, List<string>> dependencies)
{
List<List<string>> results = new List<List<string>>();
List<string> visited = new List<string>();
if (shippingFiles == null || shippingFiles.Count == 0)
{
return results;
}
for(int i = 0; i < shippingFiles.Count; i++)
{
FindIndependentComponentsRecr(shippingFiles, dependencies, results, new List<string>(), visited, shippingFiles[i]);
}
return results;
}
void FindIndependentComponentsRecr(List<string> shippingFiles, Dictionary<string, List<string>> dependencies, List<List<string>> results, List<string> result,List<string> visited, string current)
{
if (visited.Contains(current))
{
return;
}
result.Add(current);
visited.Add(current);
int count = dependencies[current].Count;
foreach(string dll in dependencies[current])
{
if (shippingFiles.Contains(dll))
{
FindIndependentComponentsRecr(shippingFiles, dependencies, results, result,visited, dll);
}
else
{
count--;
}
}
if(count == 0)
{
results.Add(new List<string>(result));
}
result.Remove(current);
}