鱼C论坛

 找回密码
 立即注册
查看: 4949|回复: 8

[已解决]n个整数组合成最大数问题(python表达)

[复制链接]
发表于 2018-6-19 16:16:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 redleafage 于 2018-6-19 16:28 编辑

题目要求:输入N个整数,自动求出这n个整数能组成的最大数。
比如输入:
3(表示一共有多少个整数)
21 7 82
则直接输出:82721


我的思想是:
1.求出输入的整数的所有可能出现的排列组合,组成一个新列表。
如输入1,2,求出的列表即为:[[1,2],[2,1]]
2.循环新列表中的每个元素,再把每个元素进行循环,组成一个字符串。
即['12','21']
3.求出列表中最大的值
即‘21’

代码如下:
#Users python3
__Author__ = 'Redleafage Zhang'
import sys
import itertools
from operator import itemgetter

def largest_number(a):
    temp= itertools.permutations(a, int(n))
    list = []

    # write your code here
    for i in temp:
        tempstr = ""
        for j in i:
            tempstr += j
        list.append(tempstr)
    res = max(list)

    return res


if __name__ == '__main__':
    input = sys.stdin.read()
    data = input.split()
    n = data[0]
    a = data[1:]
    print(largest_number(a))

整个运算的结果没问题,但是这个算法的效率低下,如果输入一长串的数,几分钟都不会出结果。所以想请教各位鱼油,有什么更好的办法来优化这个算法吗?非常感谢!
最佳答案
2018-6-19 21:58:07
本帖最后由 凌九霄 于 2018-6-19 22:07 编辑
import random
from functools import cmp_to_key

num = [random.randint(0, 1000) for i in range(random.randint(2, 1000))]
print("随机整数:{0}".format(num))


def bigNum(nums):
    key = cmp_to_key(lambda x, y: int(y + x) - int(x + y))
    result = ','.join(sorted(map(str, nums), key=key)).lstrip('0')
    return result or '0'


print("最大整数: {0}".format(bigNum(num)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-19 16:57:44 | 显示全部楼层

回帖奖励 +5 鱼币

给一种思路吧:
1 对输入的数据的首数字进行排序
2 如果首数字相同,则位数少的在前面
3 依次拼出排序后的所有数据即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-6-19 17:32:28 | 显示全部楼层
本帖最后由 关键是感觉 于 2018-6-19 17:33 编辑

根据楼上描述,C语言实现。其实写完后我发现出题人把问题给你描述复杂了。
其实就是字符串排序,从大到小,保证程序健壮性可以判断一下是否是有效的字符(ASCII 0-9)
#include "stdio.h"
#include "string.h"
void sort(char ** p){
        int i,j,k;
        for(i=0;i<3-1;i++){
                k=i;
                for(j=i+1;j<3;j++){
                        //printf("%s %s\n",*(p+k),*(p+j));
                        if(strcmp(*(p+k),*(p+j))<0){
                                k=j;
                        }        
                }
                //printf("***************\n");
                if(i-k){
                        char * t=*(p+i);
                        *(p+i)=*(p+k);
                        *(p+k)=t;
                }
        }
}
int main(int argc, char *argv[]){
        char * p[3]={"21","7","82"};
        int i;
        sort(p);

        for(i=0;i<3;i++){
                printf("%s",*(p+i));
        }
        return 0;
}
QQ拼音截图20180619151847.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-6-19 17:46:30 | 显示全部楼层
#include "stdio.h"
#include "string.h"

int Strcmp(const char *p1,const char *p2){
        char c1,c2;
        do{
                c1=*p1;
                c2=*p2;
                if(c1=='-' || c1=='+'){
                        c1=1;
                }
                if(c2=='-' || c2=='+'){
                        c2=1;
                }
        }while(c1 && c1==c2);
        return c1-c2;
}
void sort(char ** p){
        int i,j,k;
        for(i=0;i<4-1;i++){
                k=i;
                for(j=i+1;j<4;j++){
                        //printf("%c %s\n",*(*(p+k)),(*(p+k)+1));
                        if(Strcmp(*(p+k),*(p+j))>0){
                                k=j;
                        }        
                }
                //printf("***************\n");
                if(i-k){
                        char * t=*(p+i);
                        *(p+i)=*(p+k);
                        *(p+k)=t;
                }
        }
}
int main(int argc, char *argv[]){
        //char * p[3]={"-21","7","82"};
        char * p[4]={"-21","7","82","1"};
        int i;
        sort(p);

        for(i=0;i<4;i++){
                printf("%s",*(p+i));
        }
        return 0;
}
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-19 20:12:22 | 显示全部楼层
BngThea 发表于 2018-6-19 16:57
给一种思路吧:
1 对输入的数据的首数字进行排序
2 如果首数字相同,则位数少的在前面

5,57 哪个在前面?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-19 21:56:02 From FishC Mobile | 显示全部楼层
凌九霄 发表于 2018-6-19 20:12
5,57 哪个在前面?

是我考虑不全了,那就判断第一位和第二位的大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-19 21:58:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 凌九霄 于 2018-6-19 22:07 编辑
import random
from functools import cmp_to_key

num = [random.randint(0, 1000) for i in range(random.randint(2, 1000))]
print("随机整数:{0}".format(num))


def bigNum(nums):
    key = cmp_to_key(lambda x, y: int(y + x) - int(x + y))
    result = ','.join(sorted(map(str, nums), key=key)).lstrip('0')
    return result or '0'


print("最大整数: {0}".format(bigNum(num)))

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
redleafage + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-6-20 07:18:31 | 显示全部楼层
关键是感觉 发表于 2018-6-19 17:32
根据楼上描述,C语言实现。其实写完后我发现出题人把问题给你描述复杂了。
其实就是字符串排序,从大到小 ...

试试 char *P[3] = {"21","2","82"}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 13:13:34 | 显示全部楼层
我也来试试:
>>> def tol(s,n):
        s = s * (n//len(s)+1)
        s = s[:n]
        return s

>>> tol('123',5)
'12312'
>>> def fun( ls ):
        ls = [str(x) for x in ls]
        m = max(len(x) for x in ls)
        ls = sorted(ls, key=lambda x:tol(x,m), reverse=True)
        return int(''.join(ls))

>>> fun([5,57])
575
>>> fun([5,53])
553
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 22:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表