前言:不知不觉来C***P半年了,过得也算是不好不坏。遇到过出问题只会推给开发,一直抱怨却提不出方案的业务;也遇到过大V开头(可以问度娘)的水的冒泡的开发。
有两件小事和大家分享一下:
1)我们组的接口调用某个外部接口,有些条件下该外部接口会直接把exception(堆栈信息,代码物理路径也有。。)抛给我们,我邮件给相关的测试和开发,
不出意外,没有回复;后来不知道他们搞什么鬼,想让我们把这个exception也Log下来。。。
2)说起这个大V开头的,也是我们要调用的某个外部接口的开发。简单描述一下:一次做一个紧急的变更,我这把在特定的条件下,要传一个string类型的Code给他们,
特定条件不满足就不传递(也就是null),他们要和数据库存储的Code做相等比较,然后告诉我某个产品是不是某家航司定投产品(有点智商的人都知道要返一个bool 值)。
这个大V开头的,不用string.Equals(不区分大小写),而是使用Contains。。我无所谓,我要的就是一个bool值。 结果这X把Code原样返回给我,要我自己再做一次字符串比较。不想跟这种水货说太多,我忍了,自己比就比吧。
不要以为这样就完了,在某个郁闷的下午,他和他们的测试,在lync上说我们调用他们的接口时,会抛异常。于是我给他们要异常的详细信息,大体是:“System.Argumentexception NullReferenceException in String.Contains(String A, String B, StringCompare.*****)”,想必大家都明白怎么回事了,
我就在lync上问有没有做字符串的String.IsNullOrEmpty的Check,这X一口咬定说做了,并且坚持说是我们传参的问题。。。好吧,僵持了好长一会,毕竟本人级别不高,就去把事情给我师父说了,我师父去找他当面交涉,回来给我说:这件事你不用管了,不是我们的问题。看得出来,搞得我师父心情也不是很好。
算了,生活和工作难免会遇到各种问题和渣渣,但是我很幸运来这边,是我师父和我leader面试的我,并且来到了我在的team,去做好每一个变更和项目,去把O(N^2)
优化成O(Log N),乃至O(N),去把简单重复的事情做到极致!
订好元旦去西安玩的往返机票,打算这段时间把数据结构和常规的算法复习整理一下。想起来我来面试时,师父考的我第一个算法,就是该文章的题目;
特从这个开始做起,与大家共享:(刚才废话有点多,请大家勿怪)
至于字典树的理论,就很简单了,不罗嗦了,贴代码:
class TrieNode { public TrieNode[] SonTrieNodes { get; set; } public char Value { get; set; } public int Num { get; set; } public bool IsLastNode { get; set; } public TrieNode() { Num = 1; SonTrieNodes = new TrieNode[26]; } }
public class TrieTree { private TrieNode _root; public TrieTree() { _root = new TrieNode(); } public void InsertStr(string str) { if (string.IsNullOrEmpty(str)) return; var node = _root; var letters = str.ToUpper().ToCharArray(); foreach (var letter in letters) { var position = letter - ‘A‘; if (node.SonTrieNodes[position] == null) { node.SonTrieNodes[position] = new TrieNode() { Value = letter }; } else { node.SonTrieNodes[position].Num++; } node = node.SonTrieNodes[position]; } node.IsLastNode = true; } public bool isExistStr(string str) { if (string.IsNullOrEmpty(str)) return false; var node = _root; var letters = str.ToUpper().ToCharArray(); foreach (var letter in letters) { var position = letter - ‘A‘; if (node.SonTrieNodes[position] == null) { return false; } node = node.SonTrieNodes[position]; } return node.IsLastNode; } }
class Program { static void Main(string[] args) { var trieTree = new TrieTree(); string[] cities = {"HKG","SEL","NYC","SHA", "BJS","SIN","BKK"}; foreach (var city in cities) { trieTree.InsertStr(city); } Console.WriteLine("是否存在SEL:"); Console.WriteLine(trieTree.isExistStr("SEL")); Console.WriteLine("是否存在TYO:"); Console.WriteLine(trieTree.isExistStr("TYO")); Console.Read(); } }
至于,像输入一个字符,自动选择框提示该字符开头的城市、景点之类的,以及支持中文、拼音等;就可以利用字典树做变换,大家有兴趣可以自己玩玩。
祝大家周末愉快。