static void Main(string[] args) { var config = new SearchConfiguration(); var repo = new BitBucket(config); var search = new Search(repo); var projects = repo.GetProjects().Result; int i = 0; while (true) { i = 0; projects.ForEach(p => Console.WriteLine($"{i++}. {p.Name}")); Console.Write("Selection : "); int projectNumber = Convert.ToInt32(Console.ReadLine()); var repos = repo.GetRepos(projects[projectNumber]).Result; i = 0; repos.ForEach(r => Console.WriteLine($"{i++}. {r.Name}")); Console.Write("Selection : "); int repoNumber = Convert.ToInt32(Console.ReadLine()); var files = search.FindFiles(repos[repoNumber], config.FileSearchPattern).Result; //.*.csproj var grouping = search.GroupByPattern(files, config.ContentMatchPattern); //TargetFramework (.*) TargetFramework Console.Clear(); RunReport(grouping); Console.WriteLine(); Console.WriteLine(); } }
/// <summary> /// Count number of consecutive 0s and 1s and group them into buckets. /// Iterate through the buckets and calculate longest sequence of 1s when landing on bucket of 0s. /// <para>Time Complexity: O(b), where b is number of bits</para> /// <para>Space Complexity: O(k), where k is number of bit buckets</para> /// </summary> /// <param name="number"></param> /// <returns></returns> public static int FindLongestSequence(int number) { var bitBuckets = new LinkedList <BitBucket>(); // Convert decimal number to bits and store in the BitBucket Linked List - runtime O(b), where b is number of bits while (number != 0) { int bit = number & 1; if (bitBuckets.First == null || bitBuckets.First.Value.BitValue != bit) { var newBucket = new BitBucket(bit); bitBuckets.AddFirst(newBucket); } else { bitBuckets.First.Value.Count++; } number >>= 1; } if (bitBuckets.First == null || bitBuckets.First.Value.IsBit1) { bitBuckets.AddFirst(new BitBucket(0)); } // Loop through each bit bucket and calculate max length on each 0 - runtime O(m), where m is the number of buckets and m <= b int maxLength = 1; LinkedListNode <BitBucket> temp = bitBuckets.First; while (temp != null) { if (!temp.Value.IsBit1) { int prevCount = temp.Previous?.Value.Count ?? 0; int nextCount = temp.Next?.Value.Count ?? 0; if (temp.Value.Count == 1) { maxLength = Math.Max(maxLength, prevCount + nextCount + 1); } else { maxLength = Math.Max(maxLength, Math.Max(prevCount + 1, nextCount + 1)); } } temp = temp.Next; } return(maxLength); }