Skip to content

Commit

Permalink
Added new algorithm to generate numbers in lexicographical order (#11674
Browse files Browse the repository at this point in the history
)

* Added algorithm to generate numbers in lexicographical order

* Removed the test cases

* Updated camelcase to snakecase

* Added doctest

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Added descriptive name for n

* Reduced the number of letters

* Updated the return type

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Updated import statement

* Updated return type to Iterator[int]

* removed parentheses

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
1227haran and pre-commit-ci[bot] authored Oct 5, 2024
1 parent 9a572de commit 5a8655d
Showing 1 changed file with 38 additions and 0 deletions.
38 changes: 38 additions & 0 deletions data_structures/stacks/lexicographical_numbers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from collections.abc import Iterator


def lexical_order(max_number: int) -> Iterator[int]:
"""
Generate numbers in lexical order from 1 to max_number.
>>> " ".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(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(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]
"""

stack = [1]

while stack:
num = stack.pop()
if num > max_number:
continue

yield num
if (num % 10) != 9:
stack.append(num + 1)

stack.append(num * 10)


if __name__ == "__main__":
from doctest import testmod

testmod()
print(f"Numbers from 1 to 25 in lexical order: {list(lexical_order(26))}")

0 comments on commit 5a8655d

Please sign in to comment.