拼数
题目描述
设有 n个正整数 a1,a2,a3…a10,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入描述
第一行有一个整数,表示数字个数 n。
第二行有 n 个整数,表示给出的 nn 个整数 ai 。
其中, 1<= n <= 20,1 <= a_i <= 10^9
输出描述
输出一个正整数,表示最大的整数
输入输出样例
输入
3
13 312 343
输出
34331213
做题过程:
python-暴力
一开始无脑暴力得到所有排列比较大小,时间较长:
from itertools import *
n=int(input())
num=list(map(str,input().split(' ')))
max=0
for term in permutations(num):
a=''.join(term)
re=eval(a)
if re>max:
max=re
print(max)
python-先排列
(自己改的,不知道有没有改进,望各位大佬指正)
后来看到提示,可以先比大小排列然后拼接
def compare(a,b):
return a+b > b+a
n=int(input())
num=list(map(str,input().split()))
for i in range(n-1): #冒泡排序原理
for j in range(i+1,n):
if not compare(num[i],num[j]): #比较拼接后的大小
num[i],num[j]=num[j],num[i]
for x in num:
print(x,end='')
C++按字典序大小排序
又了解到别人C++做法,按字典序大小排序:
C#include<bits/stdc++.h>
using namespace std;
string a[21];
bool cmp (string a, string b){ //从大到小字典序排序
return a + b > b + a;
}
int main( ){
int n; cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n, cmp); //从大到小字典序排序
for(int i=0; i < n; i++)
cout << a[i];
return 0;
}
Java
类似上面的
再用Java尝试写:
比较时用compareTo()代替上面类似的cmp():
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner q = new Scanner(System.in);
int n = q.nextInt();
int[] nums = new int[n];
for(int i = 0; i < n; i++)
nums[i] = q.nextInt();
String[] s = new String[n];
String ans = "";
for(int i = 0; i < n; i++)
s[i] = nums[i] + "";
for(int i = 0; i < n - 1; i++) //比较
for(int j = i + 1; j < n; j++)
if((s[j] + s[i]).compareTo(s[i] + s[j]) < 0) {
String temp = s[j];
s[j] = s[i];
s[i] = temp;
}
for(int i = n - 1; i >= 0; i--)
ans += s[i];
System.out.println(ans);
}
}
在写python时,遇到了忘记了的字典排序语法:
sorted并不改变字典本身的数据次序。
输出后为列表和元组
可以
A = sorted(dic.items(),key = lambda dic:dic[0],reverse= False)
#dic[0]:按key的大小排列,reverse=False:升序排列
赋值给A ,A的次序是变化后的
python的数据类型真好用哈哈哈