题目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。
时间限制: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
****************************************************************/