【LeetCode每日一题】——179.最大数

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 排序

二【题目难度】

  • 中等

三【题目编号】

  • 179.最大数

四【题目描述】

  • 给定一组非负整数 nums,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。
  • 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

五【题目示例】

  • 示例 1:
    输入:nums = [10,2]
    输出:“210”
  • 示例 2:
    输入:nums = [3,30,34,5,9]
    输出:“9534330”
  • 示例 3:
    输入:nums = [1]
    输出:“1”
  • 示例 4:
    输入:nums = [10]
    输出:“10”

六【题目提示】

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 109

七【解题思路】

  • 很巧妙的利用排序,使用自定义排序,假设当前数组为ab,如果ab大于ba(当然,转换为字符串拼接比较,数字没法拼接,如果数字相加的话就没用了),就交换,否则不交换,这样就保证了整个数组最终按照最大数字拼接而成,最后再转为String即可。C和Java在最后转的时候有些小细节,String[]保存的是数组,开辟空间和nums一样就可以,因为里面都是一个一个的元素,而char里面就不是了,char里面一个字符占一个位置,所以char*的长度可能比nums更长,所以多开辟一些空间

八【时间频度】

  • 时间复杂度:时间复杂度主要就是快速排序的时间消耗,其他操作只是常数因子,所以时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN)

九【代码实现】

  1. Java语言版
package Sort;

import java.util.Arrays;
import java.util.Comparator;

public class p179_LargestNumber {

    public static void main(String[] args) {
        int[] nums = {3, 30, 34, 5, 9};
        String res = largestNumber(nums);
        System.out.println("res = " + res);
    }

    public static String largestNumber(int[] nums) {
        // 这个数组就是为了存储原来数字对应的字符串数组
        String[] arrs = new String[nums.length];
        int i = 0;
        // 给这个新的字符串数组赋值
        for (int num : nums) {
            arrs[i++] = String.valueOf(num);
        }
        // 新建比较排序器,如果s2+s1>s1+s2那么就交换两个元素,否则不交换,最后得到一个按照比较器排序的字符串数组
        Arrays.sort(arrs, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s2 + s1).compareTo(s1 + s2);
            }
        });
        // 如果首位为0,直接返回即可
        if (arrs[0].charAt(0) == '0') {
            return "0";
        }
        // 将结果字符串数组转换成字符串返回
        StringBuffer sb = new StringBuffer();
        for (String arr : arrs) {
            sb.append(arr);
        }
        return sb.toString();
    }

}
  1. C语言版
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include

#define MAX 10

/*自定义比较函数,如果s2+s1>s1+s2,就返回到qsort交换两个元素*/
int p179_LargestNumber_cmp(const void *p1, const void *p2)
{
	char a1[MAX * 2 + 1];
	char a2[MAX * 2 + 1];
	sprintf(a1, "%d%d", *(int*)p1, *(int*)p2);
	sprintf(a2, "%d%d", *(int*)p2, *(int*)p1);
	return (strcmp(a2, a1));
}

/*得到最终的最大数*/
char * largestNumber(int* nums, int numsSize)
{
	/*开辟结果空间*/
	char *result = malloc(numsSize * MAX + 1);
	memset(result, '\0', numsSize * MAX + 1);
	/*使用自定义比较函数,具体看cmp*/
	qsort(nums, numsSize, sizeof(int), p179_LargestNumber_cmp);
	/*如果比较排序后第一个数组是0,直接返回*/
	if (nums[0] == 0)
	{
		return "0";
	}
	/*这个p是result的指针,用于每次变换指针的位置,将数组写入到结果数组对应的位置,也就是p指针指向result的位置,当前数字是几位就+几位,最终将int类型的数组填充到字符串中*/
	char *p = result;
	for (int i = 0; i < numsSize; i++)
	{
		sprintf(p, "%d", nums[i]);
		p += strlen(p);
	}
	/*返回结果*/
	return result;
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    【LeetCode每日一题】——179.最大数_第1张图片

  2. C语言版
    【LeetCode每日一题】——179.最大数_第2张图片

你可能感兴趣的:(LeetCode,leetcode,数据结构,算法,指针,排序算法)