鱼C论坛

 找回密码
 立即注册
查看: 4422|回复: 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’

代码如下:

  1. #Users python3
  2. __Author__ = 'Redleafage Zhang'
  3. import sys
  4. import itertools
  5. from operator import itemgetter

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

  9.     # write your code here
  10.     for i in temp:
  11.         tempstr = ""
  12.         for j in i:
  13.             tempstr += j
  14.         list.append(tempstr)
  15.     res = max(list)

  16.     return res


  17. if __name__ == '__main__':
  18.     input = sys.stdin.read()
  19.     data = input.split()
  20.     n = data[0]
  21.     a = data[1:]
  22.     print(largest_number(a))


复制代码


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

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


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


  9. 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)
  1. #include "stdio.h"
  2. #include "string.h"
  3. void sort(char ** p){
  4.         int i,j,k;
  5.         for(i=0;i<3-1;i++){
  6.                 k=i;
  7.                 for(j=i+1;j<3;j++){
  8.                         //printf("%s %s\n",*(p+k),*(p+j));
  9.                         if(strcmp(*(p+k),*(p+j))<0){
  10.                                 k=j;
  11.                         }       
  12.                 }
  13.                 //printf("***************\n");
  14.                 if(i-k){
  15.                         char * t=*(p+i);
  16.                         *(p+i)=*(p+k);
  17.                         *(p+k)=t;
  18.                 }
  19.         }
  20. }
  21. int main(int argc, char *argv[]){
  22.         char * p[3]={"21","7","82"};
  23.         int i;
  24.         sort(p);

  25.         for(i=0;i<3;i++){
  26.                 printf("%s",*(p+i));
  27.         }
  28.         return 0;
  29. }
复制代码

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

使用道具 举报

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

  3. int Strcmp(const char *p1,const char *p2){
  4.         char c1,c2;
  5.         do{
  6.                 c1=*p1;
  7.                 c2=*p2;
  8.                 if(c1=='-' || c1=='+'){
  9.                         c1=1;
  10.                 }
  11.                 if(c2=='-' || c2=='+'){
  12.                         c2=1;
  13.                 }
  14.         }while(c1 && c1==c2);
  15.         return c1-c2;
  16. }
  17. void sort(char ** p){
  18.         int i,j,k;
  19.         for(i=0;i<4-1;i++){
  20.                 k=i;
  21.                 for(j=i+1;j<4;j++){
  22.                         //printf("%c %s\n",*(*(p+k)),(*(p+k)+1));
  23.                         if(Strcmp(*(p+k),*(p+j))>0){
  24.                                 k=j;
  25.                         }       
  26.                 }
  27.                 //printf("***************\n");
  28.                 if(i-k){
  29.                         char * t=*(p+i);
  30.                         *(p+i)=*(p+k);
  31.                         *(p+k)=t;
  32.                 }
  33.         }
  34. }
  35. int main(int argc, char *argv[]){
  36.         //char * p[3]={"-21","7","82"};
  37.         char * p[4]={"-21","7","82","1"};
  38.         int i;
  39.         sort(p);

  40.         for(i=0;i<4;i++){
  41.                 printf("%s",*(p+i));
  42.         }
  43.         return 0;
  44. }
复制代码

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 编辑
  1. import random
  2. from functools import cmp_to_key

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


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


  9. 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 | 显示全部楼层
我也来试试:
  1. >>> def tol(s,n):
  2.         s = s * (n//len(s)+1)
  3.         s = s[:n]
  4.         return s

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 06:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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