数据结构实验——最大数

这篇博客探讨了如何解决一个数据结构实验问题——如何重新排列一组非负整数,使按照下标顺序组成的整数最大。作者通过分析得出,关键在于获取每个数的位数和实现正确的排序算法。采用类似冒泡排序的方法,比较每个数的位数和最高位大小。源代码中详细展示了如何计算位数和实现比较逻辑,确保在比较过程中,较小的数始终位于较大的数之后,以形成最大的整数。
摘要由CSDN通过智能技术生成

题目描述

给定一组非负整数(每个非负整数大小为 0-1000),重新排列它们的顺序使之按照下标顺序
输出后组成一个最大的整数。
示例 1:
输入: 10 2
输出: 210
示例 2:
输入: 3 30 34 5 9
输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数

题目分析

  • 通过分析我们可以知道,最后得到的结果是直接输出一个数组。
  • 首先,由于要确定最大数,故应该知道每个数的位数,及每个数的最高位的大小
  • 大体思想类似于冒泡排序。首先比较前两个数谁排在前面比较小,比较小的排在后面,之后又和后面的一位数比较,直到比较到数组的尾部,即将排序时,排在前面最小的数沉底。
  • 这里的关键是如何得到每个数的位数,以及如何知道两个数之间比较,如何知道谁排在前面会比较大。

获取每个数的位数

  • 这里通过一个while循环进行计算
int getNumber(int n)//计算数字是几位数
{
   
    int ret=0;
    int i=1;
    while(n/i)
    {
   
        i=i*10;
        ret++;
    }
    return ret;//返回数字的位数
}

实现排序的算法

  • 这里的核心部分是两个数的比较,这里通过上面的计算已经获得了两个数的位数,则可以先除一定的数得商,再将得到的商除10取余就可以得到了所要比较的比较位。
  • 在比较时,一定是谁比较位先出现较小的情况时,该数放在前面会导致比较小。
  • 若出现比较位相同的情况,则都向后挪一位比较。
  • 直到比较完为止。
// 请实现排序算法
int *resort(int nums[], int n)
{
   
    int i,j;
    int x1,x2;//x1和x2是在进行比较的数字中其中一位数
    int fig1,fig2;//比较数字的位数
    int ret,count;
    for(i=0;i<n;i++)//利用冒泡进行比较
    {
   
        for(j=0;j+1<n;j++)
        {
   
            ret=0;
            count=1;
            fig1=getNumber(nums[j]);//获得第一个比较数的位数大小
            fig2=getNumber(nums[j+1]);//获得第二个比较数的位数大小
            x1=nums[j]/(int)pow(10,fig1-count);//获得比较数字中比较位数上的数字
            x2=nums[j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值