笔试题(十四):整数数组拼接最小数字

该文章提供了三种方法来解决一个问题:给定一个非负整数数组,将数组中的所有数字拼接成一个数,并输出能拼接出的最小数字。方法一是简单的排序,方法二是冒泡排序,方法三是快速排序。示例展示了如何使用这些方法对给定数组进行处理并生成最小拼接数字。
部署运行你感兴趣的模型镜像
# 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
# 示例 1:
# 输入: [10,2]
# 输出: "102"
# 示例 2:
# 输入: [3,30,34,5,9]
# 输出: "3033459"


def func(a):
    # 方法一
    b = list(map(str, a))
    b.sort()
    for i in range(len(b) - 1):
        if b[i] + b[i + 1] > b[i + 1] + b[i]:
            temp = b[i]
            b[i] = b[i + 1]
            b[i + 1] = temp
    return "".join(b)


def func2(a):
    # 方法二:冒泡排序
    b = list(map(str, a))
    for i in range(len(b) - 1):
        min_sum = b[i] + b[i + 1]
        for j in range(i + 1, len(b)):
            if b[j] + b[i] < min_sum:
                min_sum = b[j] + b[i]
                temp = b[i]
                b[i] = b[j]
                b[j] = temp
    return "".join(b)


def partition1(b, l, r):
    x = b[r]
    i = l - 1  # 记录分割位置
    for j in range(l, r):
        if b[j]+x <= x+b[j]:  # 以x为阈值,将数据划分为大于x和小于x的左右两边
            i += 1  # 分割点位置
            b[i], b[j] = b[j], b[i]  # 小于x的都交换到左边的位置上(注意,这里是交换, 原始数据集要保持不变)
    b[i + 1], b[r] = b[r], b[i + 1]  # 分割点是i+1,对应的值是x
    return i + 1


def partition2(b, left, right):
    tmp = b[left]  # 用来划分数组的中间值
    while left < right:
        while left < right and b[right]+tmp >= tmp+b[right]:  # 从右边找比tmp小的数
            right -= 1
        b[left] = b[right]  # 如果比tmp小,就把右边的值写到左边空位上

        while left < right and b[left]+tmp <= tmp+b[left]:  # 从左边找比tmp大的数
            left += 1
        b[right] = b[left]  # 如果比temp大,就把左边的值写到右边空位上
    b[left] = tmp  # 此时left和right相等了,即分割点,将分割点的值等于tmp
    # 这样就完成了一次分割,分割点的位置为left,值为tmp。左边都小于tmp,右边都大于tmp
    # 我们结果返回分割点的位置left,利用递归继续对左边和右边进行分割即可
    return left


def quick_sort(b, left, right):
    if left < right:
        mid = partition2(b, left, right)  # 数据分割,得到分割点的位置, 也可以用partition1
        quick_sort(b, left, mid - 1)  # 分割点左边进行快排
        quick_sort(b, mid + 1, right)  # 分割点右边进行快排


if __name__ == '__main__':
    # 结合python自带sort函数
    a = [3, 34, 5, 9, 30]
    print(func(a))

    print("冒泡排序:")
    print(func2(a))

    print("快排:")
    b = list(map(str, a))
    quick_sort(b, 0, len(b)-1)
    print("".join(b))

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trisyp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值