LeetCode //C - 179. Largest Number

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 <= numsi <= 10^9 0<=numsi<=109

From: LeetCode

Link: 179. Largest Number


Solution:

Ideas:
  1. Convert integers to strings: Since the concatenation of numbers as strings is required, the integers are first converted to strings.

  2. 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.

  3. 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.

  4. Concatenate sorted strings: After sorting, the strings are concatenated together to form the final result.

  5. 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;
}
相关推荐
tiger8651 分钟前
大语言模型面试和题解,梳理中国主流开源 LLM 系列的发展脉络、技术路线与工程取舍
人工智能·gpt·深度学习·算法·自然语言处理·面试·transformer
我不会起名字32214 分钟前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
学生小羊36 分钟前
C++ 初阶 学习博客
c语言·c++·c++与c语言的区别·c++基础学习
虚无的纽扣41 分钟前
【力扣刷题】第三天:有效三角形的个数、快乐数
算法·排序算法
tiger86544 分钟前
大语言模型面试和题解,Context Engineering 怎么做?长 Prompt、动态上下文与 Memory 管理
人工智能·深度学习·算法·语言模型·自然语言处理·面试·nlp
无忧.芙桃1 小时前
数据结构之排序算法(中):冒泡排序与快速排序,从相邻交换到工程级优化
c语言·c++·排序算法
不会就选b1 小时前
算法日常・每日刷题--<贪心>17
算法
Hhy_11072 小时前
《C++深度解构04》类和对象(下)——类型转换、static、友元与编译器优化
c语言·c++·学习·类和对象·visual studio
随便发挥4 小时前
Leetcode 剑指 Offer II 186. 文物朝代判断
leetcode
6Hzlia4 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode