Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 给定一个长数值字符串数组,按升序对其排序_Python_Algorithm_Sorting - Fatal编程技术网

Python 给定一个长数值字符串数组,按升序对其排序

Python 给定一个长数值字符串数组,按升序对其排序,python,algorithm,sorting,Python,Algorithm,Sorting,我正试图解决黑客银行的问题: 问题陈述: 考虑一个数字字符串数组,其中每个字符串都是1到1000000位的正数。按整数值的非降序或升序对数组的元素进行排序,并在新行上打印已排序数组的每个元素 功能描述 在下面的编辑器中完成bigSorting函数。它应该返回排序后的字符串数组 bigSorting具有以下参数: 未排序的:未排序的字符串整数数组 输入格式 6 31415926535897932384626433832795 1 3 10 3 5 1 3 3 5 10 31415926535

我正试图解决黑客银行的问题:

问题陈述

考虑一个数字字符串数组,其中每个字符串都是1到1000000位的正数。按整数值的非降序或升序对数组的元素进行排序,并在新行上打印已排序数组的每个元素

功能描述

在下面的编辑器中完成bigSorting函数。它应该返回排序后的字符串数组

bigSorting具有以下参数:

  • 未排序的
    :未排序的字符串整数数组
输入格式

6
31415926535897932384626433832795
1
3
10
3
5
1
3
3
5
10
31415926535897932384626433832795
1
10
3
3
31415926535897932384626433832795
5
第一行包含一个整数
N
,表示
未排序的
中的字符串数

N
后面的每一行都包含一个整数字符串
未排序的[i]

约束


  • 1您所做的还不够,因为您需要按文本长度排序-
    较短的字符串排在第一位,如果
    字符串的长度相同。因此,一个简单的解决方案可能是:

    n = int(input())
    unsorted = []
    for _ in range(n):
        unsorted_item = input()
        unsorted.append(unsorted_item)
    
    for element in sorted(unsorted, key=int):
        print(element)
    

    Anatolii的解决方案当然是最简单的,因为这些字符串都代表数字,它们应该按数字顺序排序

    这里有一个替代解决方案,它不需要将字符串解析为int:因为它们都是正数,所以位数越多的数字总是越大,位数相同的数字可以作为字符串进行比较。因此,首先我们通过字符串长度进行比较,然后以通常比较字符串的方式比较长度相等的字符串

    我们可以使用元组
    (len(s),s)
    作为比较键;它们通过它们的第一个分量(字符串长度)进行比较,然后通过它们的第二个分量(字符串本身)进行比较,作为一个平局断路器

    result=sorted(未排序,key=lambda s:(len,s))
    
    平均而言,这是一个更有效的解决方案,因为解析int很慢,但比较字符串通常很快,因为它们通常在前几个数字内不同。在最坏的情况下,您必须比较每个数字,但是作为int进行解析总是需要查看每个数字

    我尝试使用1000个字符串的列表,这些字符串表示0到10^(10^4)范围内的数字,即长度不超过10^4位的数字;不带
    int
    的解决方案速度快了100多倍:

    >>导入随机、timeit
    >>>lst=[str(random.randint(0,10**10**4))表示范围(1000)内的i]
    >>>timeit.timeit(lambda:sorted(lst,key=lambda s:(len(s),s)),number=10)
    0.01330024599974422
    >>>timeit.timeit(lambda:sorted(lst,key=int),number=10)
    4.78583431900006
    
    您需要将字符串转换为数字,否则您将按字母顺序排序。@MarkMeyer您不需要将字符串转换为数字,而且不转换的速度更快;看看我的答案。这是个好主意。但是,当我对长度更合理的字符串进行计时时,比如说
    random.randint(0,10**20)
    我发现
    int
    排序的性能要好得多。好吧,但问题陈述说字符串最多可以有1000000位,即
    10**10**6
    ,比
    10**10**4
    大得多。哦,是的,我误读了0-1000000。这是一个很好的解决方案。不过,你提出了一个有效的观点——这个问题是人为的,而且这个解决方案不应该用在实际代码中,因为在实际代码中,你比较的数字字符串可能要短得多。对于小于等于
    10**20
    的数字,
    int
    速度更快的原因大概是因为创建和比较元组的开销高于解析20位数字的开销。在内部,由于
    int
    对象知道自己的
    bit\u长度
    ,因此在比较数字的实际位之前,比较将首先查看该长度,这在概念上与此解决方案对字符串所做的相同。
    n = int(input())
    unsorted = []
    for _ in range(n):
        unsorted_item = input()
        unsorted.append(unsorted_item)
    
    for element in sorted(unsorted, key=int):
        print(element)