当前位置: 首页 > 知识库问答 >
问题:

由数组形成的最大数(了解解决方案)

周楷
2023-03-14
#include <stdio.h>
#include<stdlib.h>

int swap(const void *c, const void *d) {
    int n1 = *(int*)c;
    int n2 = *(int*)d;

    int a = pow(10, floor(log10(n2)) + 1) * n1 + n2;
    int b = pow(10, floor(log10(n1)) + 1) * n2 + n1;

    if (n1 == 0) return 1;
    if (a < b) return 1;

    return 0;
}

int main() {
    int t = 0, tc = 0;

    scanf("%d", &t);
    for(tc = 1; tc <= t; tc++) {
        int n;
        scanf("%d",&n);
        int arr[n];

        for (int i = 0; i < n; i++) {
            scanf("%d", &arr[i]);
        }

        qsort(arr, n, sizeof(int), swap);

        for (int i = 0; i < n; i++)
            printf("%d", arr[i]);
        printf("\n");
    }
    return 0;
}

令我惊讶的是,它通过了所有的测试用例。有人能给我解释一下这个逻辑吗?

共有1个答案

吕征
2023-03-14

这与您描述的完全相同:

int a = pow(10, floor(log10(n2)) + 1) * n1 + n2;
int b = pow(10, floor(log10(n1)) + 1) * n2 + n1;

如果在xy中传递,则axybyx

如果要将2和34串联起来,则需要将2乘以100(得到200),然后再将34相加(得到234)。100是从哪里来的?是10的34位数的次方。为了得到位数,我们计算34的以10为基数的对数,并将其四舍五入。

所以:

log10(34) ~= 1.5
floor(log10(34)) == 1
floor(log10(34)) + 1 == 2

10^2=100,所以现在我们知道在添加第二个数之前要将第一个数乘以多少。

第二行以相反的顺序对变量执行相同的操作(计算yxconcatenated)。

if (a < b) return 1;

编辑

我不确定这一行在做什么:

if (n1 == 0) return 1;

我认为它可能是在保护我们免受log10(0)结果的影响。(我不确定它返回的是什么...数学结果是负无穷大。)

 类似资料:
  • 这个问题是在亚马逊采访中问我的- 给定一个正整数数组,你必须找到一个最小的正整数,这个正整数不能由数组中的数字之和构成。 例子: 我做的是: 对数组进行排序 但这是nlog(n)解 面试官对此不满意,在不到O(n logn)的时间内提出了解决方案。

  • 有人能教我一下下面的解决方案吗?p是什么意思?为什么它的范围是j-1到I?感谢给定一个整数数组和一个数字k,找出k个不重叠的子数组,它们有最大的和。 每个子数组中的数字应该是连续的。 dp.d[i][j]表示从前i个元素中选择j个子阵列所能得到的最大和。 d[i][j]=max{d[p][j-1]+maxsubarray(p+1,i)} 我们将p从i-1迭代到j-1,这样我们就可以记录我们在当前p

  • 免责声明:我知道这个问题可以通过数组的单次传递非常有效地解决,但我对用分而治之法做这个很感兴趣,因为它与我们用分而治之法处理的典型问题有点不同。 假设给定一个浮点数组x[1:n],大小为n,间隔长度为l。问题是设计一个分治算法,从具有最大和的数组中找到长度为l的子数组。 现在,为了将问题分成两半,我决定在n-l+1/2处中断数组,以便将相等数量的子数组分配到我的除法的两半,如下面的算法所示。同样,

  • 我正在使用以下代码创建ArrayLists的数组: 如前所述,泛型数组是不允许的。我的代码是怎么编译的?

  • 本文向大家介绍.net mvc超过了最大请求长度的解决方法,包括了.net mvc超过了最大请求长度的解决方法的使用技巧和注意事项,需要的朋友参考一下 在我们的项目中遇到"超过了最大请求长度"如下图所示,是因为IIS默认请求长度4M,当请求长度大于这个值的时候报错,下面是解决方案. 解决方案:修改web.config文件 1、注意在mvc中有两个web.config文件,如下图,一个位于Views

  • 问题内容: 我试图把我的头缠在三维阵列上。我知道它们是二维数组的数组,但是我正在阅读的书说的话使我感到困惑。 在我正在阅读的书的练习中,它要求我为全彩色图像制作三维阵列。它给出了一个小例子,说明了这一点: 如果我们决定选择三维数组,则可以通过以下方式声明数组: 但是,这样会更有效吗? 其中3是rgb值,0是红色,1是绿色,2是蓝色。对于后者,每个二维数组将存储行和列的颜色值,对吗?我只想确保我了解