我在互联网上遇到了以下面试问题.
描述getValue(int index),setValue(int index,int value)和setAllValues(int value)都是O(1)的数据结构.
虽然数组足以让第一次和第二次操作在O(1)中执行,但第三次(setAllValues)可以提出什么?
检查2个树节点是否相关(即祖先 - 后代)
而已.我将在下面讨论我的解决方案(方法).如果你想先考虑自己,请停止.
对于预处理,我决定做一个预订(先递归遍历root,然后是子),并给每个节点一个标签.
让我详细解释标签.每个标签将由逗号分隔的自然数组成,如"1,2,1,4,5" - 此序列的长度等于(节点的深度+ 1).例如,根的标签是"1",root的子节点将具有标签"1,1","1,2","1,3"等.下一级节点将具有类似"1,1,1"的标签. ","1,1,2",......,"1,2,1","1,2,2",......
假设节点的" 订单号 "是其父节点的子节点列表中的"该节点的从1开始的索引 ".
通用规则:节点的标签由其父标签后跟逗号和节点的" 订单号 "组成.
因此,为了回答O(1)中两个节点是否相关(即祖先 - 后代),我将检查其中一个节点的标签是否是另一个标签的" 前缀 ".虽然我不确定这些标签是否可以被认为占据O(N)空间.
预计会有任何批评者或其他方法.
在Caliburn.Micro文档中,作者提到了这种可能性:
IHandle继承自标记接口IHandle.这允许使用强制转换来确定对象实例是否订阅任何事件.如果您与IoC容器集成,则可以实现简单的自动订阅.大多数IoC容器(包括SimpleContainer)提供了一个钩子,用于在创建新实例时调用它.只需连接容器的回调,检查正在创建的实例以查看它是否实现IHandle,如果是,请在事件聚合器上调用Subscribe.
如何通过Autofac实现这一目标?
我试图利用装饰器的功能,但当然这对于这种情况来说是不合适的.更重要的是,默认情况下,IHandle <>的实现者没有在容器中注册为IHandle的实例.
PS提供这种不正确的实现以防万一它可能有用,但我怀疑.
builder.RegisterInstance<IEventAggregator>(new EventAggregator());
builder.RegisterDecorator<IHandle>((container, handler) =>
{
var eventAggregator = container.Resolve<IEventAggregator>();
eventAggregator.Subscribe(handler);
return handler;
}, "unsubscribed", "subscribed");
Run Code Online (Sandbox Code Playgroud) 我将我的应用程序打包为jar.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>...</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
而且我的.properties文件放在里面src/main/resources.我可以随意将此文件移动到任何其他地方.我不希望将属性文件包含在jar中,而是放在同一个输出目录(我们得到jar的地方)并排放置.在Maven中最好的做法是什么?
最近(可能是设计缺点)当我需要有一个未修复的MyType<T>地方集合时T(即整个集合中有多个不同的泛型实例),我遇到了常规任务.
由于它被广泛提出(对于这种情况),宣布了一个抽象类:
public abstract class MyType {}
public class MyType<T>: MyType {}
Run Code Online (Sandbox Code Playgroud)
然后我收集了一些MyType.但是对于这个集合,我有一个约束,即任何类型的元素都不超过一个T.
因此,我做了一些自定义实现ICollection<TBase>.我想在其中包含一个Get<TParam>()获取与类型对应的项的方法TParam.以后用作:
MyCollection<MyType> collection = new MyCollection<MyType>();
MyType<int> myInt = collection.Get<int>();
Run Code Online (Sandbox Code Playgroud)
但是我意外地发现我甚至无法宣布它:
public TCustom<TParam> Get<TParam, TCustom<TParam>>() { } //this won't compile
Run Code Online (Sandbox Code Playgroud)
因为内部泛型(或所谓的"泛型泛型")既不支持C#也不支持.NET(我想).您如何看待这些限制背后是否存在任何具体原因(复杂性除外)?
更新1.询问编译器版本和编译器错误.
Microsoft C#,.NET 3.5(Visual Studio 2010).错误:
错误CS0081:类型参数声明必须是标识符而不是类型
错误CS0246:找不到类型或命名空间名称"TCustom"(您是否缺少using指令或程序集引用?)
更新2.被问及我是否需要修复或解释原因.我真的想知道为什么.但如果你有解决问题的好方法,也欢迎你.
我可以将log4j配置为每小时翻转,然后将所有每日日志文件压缩为一个zip(这样zip包含24个日志文件).
理想情况下,我只想在一周前和更早的时候压缩文件.但这是问题的另一部分.