【九度】题目1504:把数组排成最小的数

题目1504:把数组排成最小的数
时间限制:1 秒内存限制:128 兆特殊判题:否提交:862解决:255
题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000。
输出:
对应每个测试案例,
输出m个数字能排成的最小数字。
样例输入:
3
23 13 6
2
23456 56
样例输出:
13236
2345656
【解题思路】
这个问题很经典,其实就是将排序规则重新定义了一下。
具体来说,是这样的,假设有两个字符串a,b(数字可以转为字符串),如果拼接好的字符串ab<ba,那么认为a<b。

Java AC

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;
 
public class Main {
    /*
     * 2014年5月15日14:26:30
     */
    public static void main(String[] args) throws Exception {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int n = (int) st.nval;
            Integer array[] = new Integer[n];
            for (int i = 0; i < n; i++) {
                st.nextToken();
                array[i] = (int) st.nval;
            }
            StrSort strSort = new StrSort();
            Arrays.sort(array, strSort);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < n; i++) {
                sb.append(array[i]);
            }
            System.out.println(sb);
        }
    }
}
 
class StrSort implements Comparator<Integer> {
 
    public int compare(Integer o1, Integer o2) {
        String numStr1 = o1 + "" + o2;
        String numStr2 = o2 + "" + o1;
        return numStr1.compareTo(numStr2);
    }
}
/**************************************************************
    Problem: 1504
    User: wangzhenqing
    Language: Java
    Result: Accepted
    Time:1960 ms
    Memory:149288 kb
****************************************************************/
C++ AC

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 102; 
int n, i;
 
struct Node{
    char num[20];
}nodes[102];
 
bool cmp(Node node1,Node node2){
    char c[20];
    strcpy(c,node1.num);
    strcat(node1.num,node2.num);
    strcat(node2.num,c);
    return strcmp(node1.num,node2.num) < 0; 
 }   
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(i = 0; i < n; i++){
            scanf("%s",nodes[i].num);
        }
        sort(nodes,nodes+n,cmp);
        for(i = 0; i < n; i++){
            printf("%s",nodes[i].num);
        }
        printf("\n");
    }
    return 0;
} 
/**************************************************************
    Problem: 1504
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:80 ms
    Memory:1028 kb
****************************************************************/


你可能感兴趣的:(【九度】题目1504:把数组排成最小的数)