From 9c6453edb1fe443a25d7f772ebf3cf0d4f47b2b7 Mon Sep 17 00:00:00 2001 From: Peshal Agarwal Date: Sun, 25 Oct 2020 15:14:41 +0100 Subject: [PATCH 1/6] feat: added counting bits algorithm --- dynamic_programming/counting_bits.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 dynamic_programming/counting_bits.py diff --git a/dynamic_programming/counting_bits.py b/dynamic_programming/counting_bits.py new file mode 100644 index 000000000000..e9544e374d5d --- /dev/null +++ b/dynamic_programming/counting_bits.py @@ -0,0 +1,21 @@ +def countBits(num: int): + ''' + >> + ''' + ones = [0, 1] + anchor = 2 + + if num < 2: + return ones[:num+1] + + while(True): + j = 0 + while(j Date: Sun, 25 Oct 2020 15:43:12 +0100 Subject: [PATCH 2/6] Add decode remove bits --- dynamic_programming/counting_bits.py | 21 ------------ dynamic_programming/decode_ways.py | 50 ++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 21 deletions(-) delete mode 100644 dynamic_programming/counting_bits.py create mode 100644 dynamic_programming/decode_ways.py diff --git a/dynamic_programming/counting_bits.py b/dynamic_programming/counting_bits.py deleted file mode 100644 index e9544e374d5d..000000000000 --- a/dynamic_programming/counting_bits.py +++ /dev/null @@ -1,21 +0,0 @@ -def countBits(num: int): - ''' - >> - ''' - ones = [0, 1] - anchor = 2 - - if num < 2: - return ones[:num+1] - - while(True): - j = 0 - while(j 1 +'B' -> 2 +... +'Z' -> 26 +Given a non-empty string containing only digits, +determine the total number of ways to decode it. +''' + +def num_decodings(s: str): + ''' + >> num_decodings("12") + 2 + >> num_decodings("226") + 3 + ''' + if not s or int(s[0]) == 0: + return 0 + + last = 1 + second_last = 1 + + for i in range(1, len(s)): + + # 0 is a special digit since it does not + # correspond to any alphabet but can be + # meaningful if preceeded by 1 or 2 + + if s[i] == "0": + if s[i-1] in {"1", "2"}: + curr = second_last + else: + return 0 + + elif 11 <= int(s[i-1:i+1]) <= 26: + curr = second_last + last + else: + curr = last + + last, second_last = curr, last + + return last + + +if __name__ == "__main__": + import doctest + + doctest.testmod() \ No newline at end of file From 66f11072205b376bc8ed670cfb0147a10d014a90 Mon Sep 17 00:00:00 2001 From: Peshal Agarwal Date: Sun, 25 Oct 2020 16:03:17 +0100 Subject: [PATCH 3/6] fix indentation issues --- dynamic_programming/decode_ways.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/dynamic_programming/decode_ways.py b/dynamic_programming/decode_ways.py index 0b2979e643e6..4e29f24bffb5 100644 --- a/dynamic_programming/decode_ways.py +++ b/dynamic_programming/decode_ways.py @@ -10,24 +10,23 @@ ''' def num_decodings(s: str): - ''' + """ >> num_decodings("12") 2 >> num_decodings("226") 3 - ''' + """ if not s or int(s[0]) == 0: return 0 last = 1 second_last = 1 - + for i in range(1, len(s)): - # 0 is a special digit since it does not # correspond to any alphabet but can be # meaningful if preceeded by 1 or 2 - + if s[i] == "0": if s[i-1] in {"1", "2"}: curr = second_last @@ -47,4 +46,4 @@ def num_decodings(s: str): if __name__ == "__main__": import doctest - doctest.testmod() \ No newline at end of file + doctest.testmod() From 3d1d616b3a91f7776f6ec84fff95138da2bfeb6d Mon Sep 17 00:00:00 2001 From: Peshal Agarwal Date: Sun, 25 Oct 2020 16:10:48 +0100 Subject: [PATCH 4/6] indent to spaces --- dynamic_programming/decode_ways.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dynamic_programming/decode_ways.py b/dynamic_programming/decode_ways.py index 4e29f24bffb5..f52a84f52b88 100644 --- a/dynamic_programming/decode_ways.py +++ b/dynamic_programming/decode_ways.py @@ -32,7 +32,6 @@ def num_decodings(s: str): curr = second_last else: return 0 - elif 11 <= int(s[i-1:i+1]) <= 26: curr = second_last + last else: From 8e7f55bdc52df85c2ee2639729f523f14852b3a4 Mon Sep 17 00:00:00 2001 From: Peshal Agarwal Date: Sun, 25 Oct 2020 17:52:06 +0100 Subject: [PATCH 5/6] fix comments --- dynamic_programming/decode_ways.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dynamic_programming/decode_ways.py b/dynamic_programming/decode_ways.py index f52a84f52b88..fcd80eb6ade0 100644 --- a/dynamic_programming/decode_ways.py +++ b/dynamic_programming/decode_ways.py @@ -1,4 +1,4 @@ -''' +""" A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' -> 1 @@ -7,7 +7,7 @@ 'Z' -> 26 Given a non-empty string containing only digits, determine the total number of ways to decode it. -''' +""" def num_decodings(s: str): """ @@ -38,7 +38,6 @@ def num_decodings(s: str): curr = last last, second_last = curr, last - return last From 7e925425d9f7cd9a077035cdab1ec69e2f5840d4 Mon Sep 17 00:00:00 2001 From: Peshal Agarwal Date: Sun, 25 Oct 2020 18:44:41 +0100 Subject: [PATCH 6/6] Add topk --- hashes/topk.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 hashes/topk.py diff --git a/hashes/topk.py b/hashes/topk.py new file mode 100644 index 000000000000..51320ed85172 --- /dev/null +++ b/hashes/topk.py @@ -0,0 +1,33 @@ +""" +Given a non-empty list of words, return the k most frequent elements. +Your answer should be sorted by frequency from highest to lowest. +If two words have the same frequency, then the word with the lower +alphabetical order comes first. +""" +import collections + +def topk_frequent(self, words, k): + """ + >> topk_frequent(["i", "love", "leetcode", "i", "love", "coding"], 2) + ["i", "love"] + """ + count = collections.Counter(words) + freqMap = collections.defaultdict(list) + + for word, freq in count.items(): + freqMap[freq].append(word) + + freqs = list(freqMap.keys()) + heapq.heapify(freqs) + + topK = [] + for freq in heapq.nlargest(k, freqs): + topK.extend(sorted(freqMap[freq])) + if len(topK) >= k: + return topK[:k] + + +if __name__ == "__main__": + import doctest + + doctest.testmod()