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

来源:互联网 发布:画几何图形软件 编辑:程序博客网 时间:2024/05/22 08:04
题目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****************************************************************/


0 0
原创粉丝点击