From d2fc777c5e3d4aee35ad481f241e6ca9708db9d0 Mon Sep 17 00:00:00 2001 From: 1227haran Date: Wed, 2 Oct 2024 16:09:22 +0530 Subject: [PATCH 01/12] Added algorithm to generate numbers in lexicographical order --- .../stacks/lexicographical_numbers.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 data_structures/stacks/lexicographical_numbers.py diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py new file mode 100644 index 000000000000..d518d6725632 --- /dev/null +++ b/data_structures/stacks/lexicographical_numbers.py @@ -0,0 +1,35 @@ +def lexicalOrder(n: int) -> str: + """ + Generate numbers in lexical order from 1 to n and return them as a space-separated string. + + >>> lexicalOrder(13) + '1 10 11 12 13 2 3 4 5 6 7 8 9' + >>> lexicalOrder(1) + '1' + >>> lexicalOrder(20) + '1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9' + >>> lexicalOrder(25) + '1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 3 4 5 6 7 8 9' + """ + ans = [] + stack = [1] + + while stack: + num = stack.pop() + if num > n: + continue + + ans.append(str(num)) + if (num % 10) != 9: + stack.append(num + 1) + + stack.append(num * 10) + + return " ".join(ans) + +if __name__ == "__main__": + + from doctest import testmod + + testmod() + print(f"Numbers from 1 to 25 in lexical order: {lexicalOrder(25)}") From ed0553b1db7d99f7a7970e09b78663ba29927297 Mon Sep 17 00:00:00 2001 From: 1227haran Date: Wed, 2 Oct 2024 16:13:30 +0530 Subject: [PATCH 02/12] Removed the test cases --- data_structures/stacks/lexicographical_numbers.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index d518d6725632..cbda331a4b60 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,16 +1,5 @@ def lexicalOrder(n: int) -> str: - """ - Generate numbers in lexical order from 1 to n and return them as a space-separated string. - >>> lexicalOrder(13) - '1 10 11 12 13 2 3 4 5 6 7 8 9' - >>> lexicalOrder(1) - '1' - >>> lexicalOrder(20) - '1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9' - >>> lexicalOrder(25) - '1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 3 4 5 6 7 8 9' - """ ans = [] stack = [1] @@ -28,8 +17,5 @@ def lexicalOrder(n: int) -> str: return " ".join(ans) if __name__ == "__main__": - - from doctest import testmod - testmod() print(f"Numbers from 1 to 25 in lexical order: {lexicalOrder(25)}") From ae67331450f4197baf194895c6a831da9cac2b51 Mon Sep 17 00:00:00 2001 From: 1227haran Date: Wed, 2 Oct 2024 16:15:47 +0530 Subject: [PATCH 03/12] Updated camelcase to snakecase --- data_structures/stacks/lexicographical_numbers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index cbda331a4b60..86a243583024 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,4 +1,4 @@ -def lexicalOrder(n: int) -> str: +def lexical_order(n: int) -> str: ans = [] stack = [1] @@ -18,4 +18,4 @@ def lexicalOrder(n: int) -> str: if __name__ == "__main__": - print(f"Numbers from 1 to 25 in lexical order: {lexicalOrder(25)}") + print(f"Numbers from 1 to 25 in lexical order: {lexical_order(25)}") From c6f26460a1043cc3e0925608ddedc49a23373057 Mon Sep 17 00:00:00 2001 From: 1227haran Date: Wed, 2 Oct 2024 16:20:15 +0530 Subject: [PATCH 04/12] Added doctest --- data_structures/stacks/lexicographical_numbers.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index 86a243583024..dbcf8074c237 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,4 +1,16 @@ def lexical_order(n: int) -> str: + """ + Generate numbers in lexical order from 1 to n and return them as a space-separated string. + + >>> lexical_order(13) + '1 10 11 12 13 2 3 4 5 6 7 8 9' + >>> lexical_order(1) + '1' + >>> lexical_order(20) + '1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9' + >>> lexical_order(25) + '1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 3 4 5 6 7 8 9' + """ ans = [] stack = [1] @@ -17,5 +29,8 @@ def lexical_order(n: int) -> str: return " ".join(ans) if __name__ == "__main__": + + from doctest import testmod + testmod() print(f"Numbers from 1 to 25 in lexical order: {lexical_order(25)}") From d62b61f4c408de6bb5236bb167c63ac2e1c656ad Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:51:35 +0000 Subject: [PATCH 05/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/stacks/lexicographical_numbers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index dbcf8074c237..5420efd3c821 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -19,17 +19,17 @@ def lexical_order(n: int) -> str: num = stack.pop() if num > n: continue - + ans.append(str(num)) - if (num % 10) != 9: + if (num % 10) != 9: stack.append(num + 1) stack.append(num * 10) return " ".join(ans) + if __name__ == "__main__": - from doctest import testmod testmod() From 17356b018acdefea56a488162f90793640912fc6 Mon Sep 17 00:00:00 2001 From: 1227haran Date: Wed, 2 Oct 2024 16:23:59 +0530 Subject: [PATCH 06/12] Added descriptive name for n --- data_structures/stacks/lexicographical_numbers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index dbcf8074c237..1a03b4ffc5d7 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,6 +1,6 @@ -def lexical_order(n: int) -> str: +def lexical_order(max_number: int) -> str: """ - Generate numbers in lexical order from 1 to n and return them as a space-separated string. + Generate numbers in lexical order from 1 to max_number and return them as a space-separated string. >>> lexical_order(13) '1 10 11 12 13 2 3 4 5 6 7 8 9' @@ -17,7 +17,7 @@ def lexical_order(n: int) -> str: while stack: num = stack.pop() - if num > n: + if num > max_number: continue ans.append(str(num)) From 8762b5198debf6a5ca655acaafbd25611f26d391 Mon Sep 17 00:00:00 2001 From: 1227haran Date: Wed, 2 Oct 2024 16:29:58 +0530 Subject: [PATCH 07/12] Reduced the number of letters --- data_structures/stacks/lexicographical_numbers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index 843df5f170f1..91c6a22b5a82 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,6 +1,6 @@ def lexical_order(max_number: int) -> str: """ - Generate numbers in lexical order from 1 to max_number and return them as a space-separated string. + Generate numbers in lexical order from 1 to max_number. >>> lexical_order(13) '1 10 11 12 13 2 3 4 5 6 7 8 9' From 07edd684a509921b861ab103175243e155fca50e Mon Sep 17 00:00:00 2001 From: 1227haran Date: Thu, 3 Oct 2024 09:09:04 +0530 Subject: [PATCH 08/12] Updated the return type --- .../stacks/lexicographical_numbers.py | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index 91c6a22b5a82..adc1e67c2261 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,18 +1,21 @@ -def lexical_order(max_number: int) -> str: +from typing import Iterator + +def lexical_order(max_number: int) -> Iterator[str]: """ Generate numbers in lexical order from 1 to max_number. - >>> lexical_order(13) + >>> " ".join(lexical_order(13)) '1 10 11 12 13 2 3 4 5 6 7 8 9' - >>> lexical_order(1) - '1' - >>> lexical_order(20) + >>> list(lexical_order(1)) + ['1'] + >>> " ".join(lexical_order(20)) '1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9' - >>> lexical_order(25) + >>> " ".join(lexical_order(25)) '1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 3 4 5 6 7 8 9' + >>> list(lexical_order(12)) + ['1', '10', '11', '12', '2', '3', '4', '5', '6', '7', '8', '9'] """ - ans = [] stack = [1] while stack: @@ -20,17 +23,15 @@ def lexical_order(max_number: int) -> str: if num > max_number: continue - ans.append(str(num)) + yield(str(num)) if (num % 10) != 9: stack.append(num + 1) stack.append(num * 10) - return " ".join(ans) - if __name__ == "__main__": from doctest import testmod testmod() - print(f"Numbers from 1 to 25 in lexical order: {lexical_order(25)}") + print(f"Numbers from 1 to 25 in lexical order: {list(lexical_order(26))}") From 413132399d31d4787be3d3575193919774055215 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 03:40:41 +0000 Subject: [PATCH 09/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/stacks/lexicographical_numbers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index adc1e67c2261..9b9dfd5012a1 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,5 +1,6 @@ from typing import Iterator + def lexical_order(max_number: int) -> Iterator[str]: """ Generate numbers in lexical order from 1 to max_number. @@ -23,7 +24,7 @@ def lexical_order(max_number: int) -> Iterator[str]: if num > max_number: continue - yield(str(num)) + yield (str(num)) if (num % 10) != 9: stack.append(num + 1) From 628b47d94aff8d622afea8f4317bc73d2818ca4a Mon Sep 17 00:00:00 2001 From: 1227haran Date: Thu, 3 Oct 2024 09:13:44 +0530 Subject: [PATCH 10/12] Updated import statement --- data_structures/stacks/lexicographical_numbers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index adc1e67c2261..32a8e90ae71c 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,4 +1,4 @@ -from typing import Iterator +from collections.abc import Iterator def lexical_order(max_number: int) -> Iterator[str]: """ From 8b4f4cdbcea19ba4da0f187abb440621bdd33c61 Mon Sep 17 00:00:00 2001 From: 1227haran Date: Fri, 4 Oct 2024 22:07:46 +0530 Subject: [PATCH 11/12] Updated return type to Iterator[int] --- data_structures/stacks/lexicographical_numbers.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index b492f41a00ec..52efa89b306a 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -1,20 +1,20 @@ from collections.abc import Iterator -def lexical_order(max_number: int) -> Iterator[str]: +def lexical_order(max_number: int) -> Iterator[int]: """ Generate numbers in lexical order from 1 to max_number. - >>> " ".join(lexical_order(13)) + >>> " ".join(map(str, lexical_order(13))) '1 10 11 12 13 2 3 4 5 6 7 8 9' >>> list(lexical_order(1)) - ['1'] - >>> " ".join(lexical_order(20)) + [1] + >>> " ".join(map(str, lexical_order(20))) '1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9' - >>> " ".join(lexical_order(25)) + >>> " ".join(map(str, lexical_order(25))) '1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 3 4 5 6 7 8 9' >>> list(lexical_order(12)) - ['1', '10', '11', '12', '2', '3', '4', '5', '6', '7', '8', '9'] + [1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9] """ stack = [1] @@ -24,7 +24,7 @@ def lexical_order(max_number: int) -> Iterator[str]: if num > max_number: continue - yield (str(num)) + yield (num) if (num % 10) != 9: stack.append(num + 1) From 667bfc7063acf723c3acfb0dcfd6d8177b241bbc Mon Sep 17 00:00:00 2001 From: 1227haran Date: Fri, 4 Oct 2024 22:09:09 +0530 Subject: [PATCH 12/12] removed parentheses --- data_structures/stacks/lexicographical_numbers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/lexicographical_numbers.py b/data_structures/stacks/lexicographical_numbers.py index 52efa89b306a..6a174e7d9e95 100644 --- a/data_structures/stacks/lexicographical_numbers.py +++ b/data_structures/stacks/lexicographical_numbers.py @@ -24,7 +24,7 @@ def lexical_order(max_number: int) -> Iterator[int]: if num > max_number: continue - yield (num) + yield num if (num % 10) != 9: stack.append(num + 1)