179. Largest Number
Given a list of non-negative integers nums, arrange them such that they form the largest number and return it.
Since the result may be very large, so you need to return a string instead of an integer.
Example 1:
Input: nums = [10,2]
Output: "210"
Example 2:
Input: nums = [3,30,34,5,9]
Output: "9534330"
Constraints:
- 1 <= nums.length <= 100
- 0 < = n u m s [ i ] < = 1 0 9 0 <= nums[i] <= 10^9 0<=nums[i]<=109
From: LeetCode
Link: 179. Largest Number
Solution:
Ideas:
-
Convert integers to strings: Since the concatenation of numbers as strings is required, the integers are first converted to strings.
-
Custom Comparator: A custom comparator function is used to sort these strings. The key idea here is to determine the order of any two strings a and b by comparing the two possible concatenations: a+b and b+a. If a+b is greater than b+a, then a should come before b in the final order, and vice versa.
-
Sort the strings: Using the custom comparator, the list of strings is sorted in such a way that concatenating them in this order results in the largest possible number.
-
Concatenate sorted strings: After sorting, the strings are concatenated together to form the final result.
-
Edge Case Handling: If the largest number is 0, meaning all numbers are zero, the result should simply be "0".
Code:
c
int compare(const void *a, const void *b) {
// Cast the pointers to strings
const char *str1 = *(const char **)a;
const char *str2 = *(const char **)b;
// Allocate enough space to hold the two concatenated results
char option1[22];
char option2[22];
// Concatenate str1+str2 and str2+str1
sprintf(option1, "%s%s", str1, str2);
sprintf(option2, "%s%s", str2, str1);
// Return the comparison result in descending order
return strcmp(option2, option1);
}
char* largestNumber(int* nums, int numsSize) {
if (numsSize == 0) return "";
// Convert numbers to strings
char **numsStr = (char **)malloc(numsSize * sizeof(char *));
for (int i = 0; i < numsSize; ++i) {
numsStr[i] = (char *)malloc(12 * sizeof(char)); // Enough for an integer with max 10 digits and a null terminator
sprintf(numsStr[i], "%d", nums[i]);
}
// Sort the array with custom comparator
qsort(numsStr, numsSize, sizeof(char *), compare);
// If the highest number is "0", the entire number is "0"
if (strcmp(numsStr[0], "0") == 0) {
// Free allocated memory
for (int i = 0; i < numsSize; ++i) {
free(numsStr[i]);
}
free(numsStr);
return "0";
}
// Calculate total length for the resulting string
int totalLength = 0;
for (int i = 0; i < numsSize; ++i) {
totalLength += strlen(numsStr[i]);
}
// Allocate space for the result string
char *result = (char *)malloc((totalLength + 1) * sizeof(char));
result[0] = '\0'; // Initialize to an empty string
// Concatenate all strings
for (int i = 0; i < numsSize; ++i) {
strcat(result, numsStr[i]);
free(numsStr[i]); // Free the individual string after use
}
free(numsStr); // Free the array of string pointers
return result;
}