Skip to content

Commit 5a8655d

Browse files
Added new algorithm to generate numbers in lexicographical order (#11674)
* 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>
1 parent 9a572de commit 5a8655d

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from collections.abc import Iterator
2+
3+
4+
def lexical_order(max_number: int) -> Iterator[int]:
5+
"""
6+
Generate numbers in lexical order from 1 to max_number.
7+
8+
>>> " ".join(map(str, lexical_order(13)))
9+
'1 10 11 12 13 2 3 4 5 6 7 8 9'
10+
>>> list(lexical_order(1))
11+
[1]
12+
>>> " ".join(map(str, lexical_order(20)))
13+
'1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9'
14+
>>> " ".join(map(str, lexical_order(25)))
15+
'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'
16+
>>> list(lexical_order(12))
17+
[1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9]
18+
"""
19+
20+
stack = [1]
21+
22+
while stack:
23+
num = stack.pop()
24+
if num > max_number:
25+
continue
26+
27+
yield num
28+
if (num % 10) != 9:
29+
stack.append(num + 1)
30+
31+
stack.append(num * 10)
32+
33+
34+
if __name__ == "__main__":
35+
from doctest import testmod
36+
37+
testmod()
38+
print(f"Numbers from 1 to 25 in lexical order: {list(lexical_order(26))}")

0 commit comments

Comments
 (0)