首页 > 试题广场 >

比大更大

[编程题]比大更大
  • 热度指数:2120 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一列非负整数,求这些数连接起来能组成的最大的数。

输入描述:
第一行n>0是一个正整数,表示一共有n个输入。以后每行是一个非负整数,共有n行。


输出描述:
n个输入的非负整数连接成的最大的数
示例1

输入

6
9
8
7
65
4
3

输出

9876543
示例2

输入

2
11
2

输出

211
# include <iostream>
# include <string>
# include <vector>
# include <algorithm>
using namespace std;
bool compare(string &a, string &b){
    return (a+b) > (b+a);
}
int main(){
    int n;
    cin >> n;
    vector<string> str(n,"");
    for (int i =0;i<n;i++){
        cin >> str[i];
    }
    sort(str.begin(), str.end(), compare);
    string res;
    for (auto c : str){
        res += c;
    }
    cout << res <<endl;
    return 0;
}
发表于 2019-06-25 18:37:36 回复(4)
leetcode179题
发表于 2019-06-30 16:12:00 回复(1)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int length = sc.nextInt();
        String result = "";
        List<String> list = new ArrayList<>();
        for(int i = 0; i < length; i++){
            list.add(sc.next());
        }
        sc.close();
        list.sort((String s1, String s2) -> s1.startsWith(s2) ? 1 : s2.startsWith(s1) ? -1 : -s1.compareTo(s2));
        if(list.size() > 0 && !"0".equals(list.get(0)))
            for(String s : list) result +=  s;

        System.out.print(result.equals("") ? "0" : result);
    }

}

编辑于 2019-07-16 16:34:42 回复(6)
while True:
    try:
        num1 = int(input())
        num2 = []
        for i in range(num1):
            num2.append(str(input()))
        num2.sort(reverse =True)
        for i in range(len(num2)-1):
            if(num2[i]+num2[i+1] < num2[i+1]+num2[i]):
                num2[i],num2[i+1] = num2[i+1],num2[i]
        result = ''.join(num2)
        while (len(result)>1 and result[0]=='0'):
            result= result[1:]
        print(result)
    except:
        break

编辑于 2019-08-07 21:15:12 回复(2)
直接自定义数组排序规则,然后顺序拼接数组元素即可
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String strN;
        while((strN = br.readLine()) != null){
            int n = Integer.parseInt(strN);
            String[] arr = new String[n];
            for(int i = 0; i < n; i++)
                arr[i] = br.readLine().trim();
            // 自定义排序方法
            Arrays.sort(arr, new Comparator<String>() {
                public int compare(String a, String b) {
                    return (b + a).compareTo(a + b);
                }
            });
            // 排好序后顺序连接即可
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < n; i++)
                sb.append(arr[i]);
            if(sb.toString().charAt(0) == '0')
                System.out.println(0);
            else
                System.out.println(sb.toString());
        }
    }
}


发表于 2020-10-24 12:48:59 回复(0)
位数不同但是首位相同,使用string自动判断不行;
我是参考了第一位大佬的相加进行判断后才AC(PS:这里大佬真的巨多)
#include "iostream"
#include "string"
#include "vector"
#include "map"
using namespace std;
int main()
{
    int n;
    bool flag = false;
    string str;
    vector<string> answer;
    multimap<string, int> ans;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> str;
        ans.insert(pair<string, int>(str, i));
    }

    for (auto i = ans.begin(); i != ans.end(); i++)
    {
        answer.push_back(i->first);
    }
    for (int i = 0; i < answer.size(); i++)
    {
        if (answer[i] != "0")
        {
            flag = true;
            break;
        }
    }
    if (flag)
    {
        for (int i = 0; i < answer.size(); i++)
        {
            for (int j = i + 1; j < answer.size(); j++)
            {
                if (answer[i] + answer[j] > answer[j] + answer[i])
                {
                    string temp = answer[i];
                    answer[i] = answer[j];
                    answer[j] = temp;
                }
            }
        }
        for (int i = answer.size() - 1; i >= 0; i--)
        {
            cout << answer[i];
        }
    }
    else
    {
        cout << "0" << endl;
    }

    return 0;
}
发表于 2019-09-13 10:47:13 回复(0)
 import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int line = sc.nextInt();//数字个数
        String []strArr = new String[line];
        int arr_i = 0;//为数组计数
        while(line-- > 0) {
            int num = sc.nextInt();
            strArr[arr_i++] = num+"";
        }
        
        Arrays.sort(strArr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo((o1 + o2));
            }
        });
        
        
        StringBuffer res = new StringBuffer();
        for (String i : strArr) {
            res.append(i);
        }
        System.out.println(res.toString());
        
        sc.close();
    }

}
   

发表于 2019-07-31 20:26:43 回复(0)
# -*- coding: UTF-8 -*-
# input data
rows = int(input())
nums = [int(input()) for num in range(rows)]
 
# sorted func
from functools import cmp_to_key
res =''.join(sorted(map(str,nums),key=cmp_to_key(lambdax,y: int(y+x)-int(x+y))))
res =res if res[0] !='0' else '0'
# print(rows)
# print(nums)
print(res)

发表于 2019-07-05 15:52:00 回复(0)

import java.util.Scanner;

/**
 *      给定一列非负整数,求这些数连接起来能组成的最大的数。
 * @author Administrator
 *
 */
/*
 * 思路:非负整数:0-9
 * 从大到小排序:冒泡排序
 */
public class IHandy2 {
    
    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        System.out.println("请输入任意个非负整数:");
        int a = in.nextInt();
        //将整数转化为数组
        //先将整数转化为字符串
        String string = Integer.toString(a);
        //定义一个长度为string的整形数组
        int[] intArray = new int[string.length()];

        //将string转化为整型数组
        for(int i=0; i<intArray.length; i++) {
            //charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
            char c = string.charAt(i);
         
            String string2 = String.valueOf(c);
          ;
            intArray[i] = Integer.parseInt(string2);
       
        }
        
    
        //冒泡排序,从大到小
        for(int i=intArray.length-1; i>0; i--) {
            for(int j=0; j<i; j++) {
                int temp = 0;
                if(intArray[j]<intArray[j+1]) {
                    temp = intArray[j];
                    intArray[j] = intArray[j+1];
                    intArray[j+1] = temp;
                }
            }
        }
        
        //输出intArray[]
        System.out.println();
        System.out.println("最大的数为:");
        for(int i=0; i<intArray.length; i++) {
            System.out.print(intArray[i]);
        }
        
    }
    
}
发表于 2019-06-27 17:52:15 回复(1)
n = int(input())
Sum = []
Sum_2 = []
for i in range(n):
    Sum.append(str(input()))

Sum.sort(reverse = True)
for i in range(len(Sum)-1):
    if Sum[i][0] == Sum[i+1][0] and len(Sum[i]) > len(Sum[i+1]):
        t = Sum[i]
        Sum[i] = Sum[i+1]
        Sum[i+1] = t
        
if Sum[0] == '0':
    print(0)
else:
    for i in Sum:
        print(i, end = '')
发表于 2020-06-10 21:27:45 回复(0)
n = int(input())
li = []
for _ in range(n):
    li.append(input())
for i in range(n):
    for j in range(i + 1, n):
        if li[i] + li[j] < li[j] + li[i]:
            li[i], li[j] = li[j], li[i]
print(int("".join(li)))

发表于 2020-04-09 14:54:04 回复(0)
n = int(input())
nums = []
for i in range(n):
    nums.append(input())


lis_0 = [] 
for i in nums:
    num = []
    for j in i:
        num.extend(j)
    lis_0.extend(num[0])
        
lis_0 = list(int(i) for i in lis_0)

t = list(zip(lis_0, nums))

def take_one(lis): 
    return lis[0]
t.sort(key=take_one, reverse=True)

if t[1][0] == 0:
    print('0')
else:
    lis_1 = list(i[1] for i in t)
    
    s = ''.join(lis_1)
    
    print(s)
# case 60%有没有大神能看下
编辑于 2020-03-28 21:27:02 回复(0)
import sys
lis=[]
res = ""
result = []
a = sys.stdin.readline().strip()
while True:
    a = sys.stdin.readline().strip()
    if a:
        lis.append(a)
    else:
        break
for j in range(len(lis)-1):
    for i in range(len(lis)-1-j):
        if int(lis[i] + lis[i+1]) < int(lis[i+1] + lis[i]):
            lis[i],lis[i+1] = lis[i+1],lis[i]
for i in lis:
    res+= i 
if res[0]=="0":
    print(0)
else:
    print(int(res))
冒泡排序算法 时间复杂度 O N的平方
发表于 2020-01-12 20:16:06 回复(0)
import sys

if __name__ == '__main__':

    while True:
        line = sys.stdin.readline().strip()
        if line == '':
            break
        lines = line.split()

        n = int(lines[0])

        nums = []  # 保存数字列
        for i in range(n):
            nums.append(int(sys.stdin.readline().strip().split()[0]))

        nums = list(map(str, nums))  # 转为字符列表

        flag = True  # 冒泡排序结束的标志
        while flag:
            flag = False
            for i in range(len(nums)-1):
                if nums[i] + nums[i+1] < nums[i+1] + nums[i]:
                    temp = nums[i]
                    nums[i] = nums[i+1]
                    nums[i+1] = temp
                    flag = True

        print(int("".join(nums)))

发表于 2019-08-21 22:17:49 回复(0)
from functools import cmp_to_key
 
 
def cmp(a, b):
    if len(a) == 0:
        return -1
    elif len(b) == 0:
        return 1
    elif len(a) == len(b):
        return -1 if a > b else 1
    else:
        if a[0] > b[0]:
            return -1
        elif a[0] < b[0]:
            return 1
        else:
            return cmp(a[1:], b[1:])
         
     

if __name__ == "__main__":
    n = int(input())
    d = []
    for i in range(n):
        d.append(input())
    d = sorted(d, key=cmp_to_key(cmp))
    ans = int("".join(d))
    print(ans)


编辑于 2019-08-20 15:13:28 回复(0)
importsys
lines =sys.stdin.readlines()
count =int(lines[0].strip())
number =[]
 
fori inrange(1,len(lines)):
    number.append(lines[i].strip())
defsorting(n1,n2):
    if(n1+n2)>(n2+n1):
        return-1
    elif(n1 +n2) ==(n2 +n1):
        return0
    else:
        return1
number =sorted(number,sorting)
print(int(''.join(number)))
发表于 2019-08-03 10:03:17 回复(0)
//#include "stdafx.h"
# include<iostream>
# include<vector>
# include<algorithm>
using namespace std;
bool camp(int a, int b)
{
    
    if (int(log10(a)) != int(log10(b))) //位数不同时
    {
        while (int(log10(a))!=int (log10(b))  )
        {
            if (a < b) a = a * 10+9;
            else b = b * 10+9;///小数末尾补9 再比较
        }
        return a > b;
    }
    return a > b;
};
int main()
{

        int n;
        cin >> n;
        int temp;
        vector<int > v;
        for (int i = 0; i < n; i++)
        {
            cin >> temp;
            v.push_back(temp);
        }
        sort(v.begin(), v.end(), camp);
        for (int i = 0; i < v.size(); i++)
        
            if (v[0]==0) 
            {cout<<0;
            break;
            }
            else 
             cout << v[i];
            
        }
            
        //system("pause");
    
}
发表于 2019-08-02 20:24:23 回复(0)
import java.util.Scanner;

public class Main{

public static void main(String[] args){
Scanner s=new Scanner(System.in);
int input=s.nextInt();
int[] a=new int[input];
for(int i=0;i<input;i++){
int j=s.nextInt();
a[i]=j;
}
s.close();
int temp=0;
for(int i=a.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(paixu(a[j],a[j+1])){
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
String num="";
if(a[0]==0) {
num="0";
}else {
for(int b:a){
num+=b;
}
}


System.out.println(num);
}
public static boolean paixu(int num1,int num2) {
  int p1=String.valueOf(num1).length();
        int p2=String.valueOf(num2).length();
        long r1=num1;
        long r2=num2;
           for(int i=0;i<p2;i++){
            r1=r1*10;
        }
            for(int i=0;i<p1;i++){
            r2=r2*10;
        }
       r1+=num2;
       r2+=num1;
        if(r1<r2) {
            return true; 
        }else {
            return false;
            
        }




}
}

编辑于 2019-08-08 19:21:17 回复(0)
class Solution(object):
    def largestNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: str
        """
        for i in range(len(nums)):
            for j in range(len(nums) - i - 1):
                if str(nums[j]) + str(nums[j + 1]) > str(nums[j + 1]) + str(nums[j]):
                    nums[j], nums[j + 1] = nums[j + 1], nums[j]
        s = ''
        if nums[-1] == 0:
            return('0')
        for i in nums:
            s = str(i) + s
        return s

发表于 2019-07-30 16:20:31 回复(0)
排序
发表于 2019-07-30 12:39:05 回复(0)