Skip to content

Commit 903c68b

Browse files
committed
Largest number
1 parent 3aeef9d commit 903c68b

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

179.largest_number/numbers.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# 179. Largest number
2+
# Topics: 'Array', 'String', 'Greedy', 'Sorting'
3+
# Level: 'Medium'
4+
5+
# Given a list of non-negative integers nums, arrange them such that they form the largest number and return it.
6+
7+
# Since the result may be very large, so you need to return a string instead of an integer.
8+
9+
10+
11+
# Example 1:
12+
13+
# Input: nums = [10,2]
14+
# Output: "210"
15+
16+
# Example 2:
17+
18+
# Input: nums = [3,30,34,5,9]
19+
# Output: "9534330"
20+
21+
22+
23+
# Constraints:
24+
25+
# 1 <= nums.length <= 100
26+
# 0 <= nums[i] <= 109
27+
28+
from functools import cmp_to_key
29+
from typing import List
30+
31+
class Solution:
32+
def largestNumber(self, nums: List[int]) -> str:
33+
nums_str = list(map(str, nums))
34+
def compare(x, y):
35+
if x + y > y + x:
36+
return -1
37+
elif x + y < y + x:
38+
return 1
39+
return 0
40+
nums_str.sort(key=cmp_to_key(compare))
41+
if nums_str[0] == '0':
42+
return nums_str[0]
43+
return ''.join(nums_str)

179.largest_number/test_numbers.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import unittest
2+
from numbers import Solution # adjust if your file name differs
3+
4+
class TestLargestNumber(unittest.TestCase):
5+
6+
def test_example_1(self):
7+
self.assertEqual(Solution().largestNumber([10, 2]), "210")
8+
9+
def test_example_2(self):
10+
self.assertEqual(Solution().largestNumber([3, 30, 34, 5, 9]), "9534330")
11+
12+
def test_single_element(self):
13+
self.assertEqual(Solution().largestNumber([1]), "1")
14+
15+
def test_zero(self):
16+
self.assertEqual(Solution().largestNumber([0]), "0")
17+
18+
def test_all_zeros(self):
19+
self.assertEqual(Solution().largestNumber([0, 0]), "0")
20+
21+
def test_prefix_case(self):
22+
# tricky: 121 vs 12
23+
self.assertEqual(Solution().largestNumber([121, 12]), "12121")
24+
25+
def test_duplicates(self):
26+
self.assertEqual(
27+
Solution().largestNumber([8308, 8308, 830]),
28+
"83088308830"
29+
)
30+
31+
def test_large_numbers(self):
32+
self.assertEqual(
33+
Solution().largestNumber([999999998, 999999997]),
34+
"999999998999999997"
35+
)
36+
37+
def test_compare_edge_conflict(self):
38+
# 343 + 34 = 34334
39+
# 34 + 343 = 34343 → larger
40+
self.assertEqual(
41+
Solution().largestNumber([343, 34]),
42+
"34343"
43+
)
44+
45+
def test_many_zeros_with_nonzero(self):
46+
self.assertEqual(
47+
Solution().largestNumber([0, 0, 1, 0]),
48+
"1000"
49+
)
50+
51+
def test_max_input_size(self):
52+
nums = [10**9] * 100
53+
expected = "1000000000" * 100
54+
self.assertEqual(Solution().largestNumber(nums), expected)
55+
56+
57+
if __name__ == "__main__":
58+
unittest.main()

0 commit comments

Comments
 (0)