把数组中的数拼接起来,求最大值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把数组中的数拼接起来,求最大值相关的知识,希望对你有一定的参考价值。

[常见面试题]拼接最大数/最小数

// 把数组中的数拼接起来,求最大值(最小值)

// 拼接起来求最大/最小,本质上就是对数据进行一种特殊的排序,将待比较的两个数字进行拼接然后做比较

// 比如a,b 需要比较ab和ba的大小,从而得出a,b的大小

// 最大/最小已经在代码中注释出来了

#include<stdio.h>

int cmpfunc_ex(const void *a, const void *b)

    char str1[21] = 0;

    char str2[21] = 0;

    sprintf(str1, "%d%d", *(int *)a, *(int *)b);

    sprintf(str2, "%d%d", *(int *)b, *(int *)a);

    char *p1 = str1;

    char *p2 = str2;

    int result = strcmp(str1, str2);

    return (-result); // 求最大

    //return (result); // 求最小

 

int main(void)

    char result[200] = 0;

    char *p = result;

    int a[] = 3, 32, 321, 2, 1, 3;

    int nCount = sizeof(a) / sizeof(int);

    qsort(a, sizeof(a) / sizeof(int), sizeof(int), cmpfunc_ex);

    for (int i = 0; i < nCount; ++i) 

        sprintf(p, "%d", a[i]);

        p = &result[strlen(result)];

    

    printf("%s\\r\\n", result);

    return 0;

参考技术A #include <stdio.h>
int main()

int i, j, n, max, num[100];
printf("输入整数个数:");
scanf("%d", &n);
printf("输入不同的整数:");
for(i = 0; i < n; i++)
scanf("%d", &num[i]);


j = 0;
max = num[0];
for(i = 1; i < n: i++)
if(num[i] > max)
max = num[i];
j = i;


printf("%d %d", j, max);
return 0;

把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323。

思路:

本体有两个难点:第一个难点是想出一种新的比较规则来排序一个数组;第二个难点在于证明这个比较规则是有效的,并且证明根据这个规则排序之后把数组中所有数字拼接起来得到的数字是最小的。

考察解决大数问题的能力。应聘者在面试的时候要意识到,把两个int型的整数拼接起来得到的数字可能会超出int型数字能够表达的范围,从而导致数字益处。我们可以用字符串表示数字,这样就能简洁地解决大数问题。

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class minCmp{
    public String getMin(int[] array){
        if(array == null || array.length == 0) return "";
        String[] str = new String[array.length];
        for(int i=0;i<array.length;i++){
            str[i] = String.valueOf(array[i]);
        }
        Arrays.sort(str,new Comparator<String>(){
            @Override
            public int compare(String o1,String o2){
                return (o1+o2).compareTo(o2+o1);
            }
        });
        String cc = "";
        for(int i=0;i<str.length;i++){
            cc += str[i];
        }
        return cc;
    }
    public static void main(String[] args){
//         Scanner scanner = new Scanner(System.in);
//         System.out.println("请任意输入一个数组(以“,”隔开):");
//         String str = scanner.nextLine();
//         String[] temp = str.split(",");
//         scanner.close();
//         int[] array = new int[temp.length];
//         for(int i = 0;i < temp.length;i++)
//         {
//             array[i] = Integer.parseInt(temp[i]);
//         }
        
        int[] array = {3,32,321};
        minCmp comparefun = new minCmp();
        System.out.println("---" + comparefun.getMin(array));
    }
}

 

以上是关于把数组中的数拼接起来,求最大值的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 45. 把数组排成最小的数-排序(179. 最大数)

剑指offer-把数组排成最小的数

321. 拼接最大数

剑指offer-把数组排成最小的数

编程之美寻找数组中的最大值和最小值

树状数组求逆序对