bilibili-2020算法笔试第一题-输出数组拼接最大数

'''
输入一组非负数, 输出这些数的拼接,保证该拼接后的数最大
input 20,203
output 20320
'''
import sys
def split_number(number):
    '''

    :param number: 123
    :return: [1, 2, 3]
    '''
    length = len(str(number))
    i = length-1
    str_num = [0 for i in range(length)]
    n = number
    while n > 0:
        temp = n % 10
        str_num[i] = temp
        i -= 1
        n = (n-temp) // 10
    return str_num

def who_is_first(num1, num2):
    num1_char = split_number(num1)  #
    num2_char = split_number(num2)

    flag = True

    length_num1 = len(num1_char)  # 第一个数的位数
    length_num2 = len(num2_char)  # 第二个数的位数
    i = 0
    j = 0

    while i < length_num1 and j < length_num2 :
        if num1_char[i] < num2_char[j]:
            flag = False
            return flag
        elif num1_char[i] == num2_char[j] and length_num1 != length_num2:
            if i == len(num1_char)-1:  # 第一个数比较短,再看第二个数的第(length_num1+1)个数是否比第一个数的第一位大
                if num2_char[(length_num1+1)-1] > num1_char[0]:
                    flag = False
                else:
                    flag = True
                return flag
            elif j == len(num2_char)-1:  # 第二个数比较短
                if num1_char[(length_num2+1)-1] > num2_char[0]:  # 第二个数比较短,再看第一个数的第(length_num2+1)个数是否比第二个数的第一位大
                    flag = True
                else:
                    flag = False
                return flag
        else:
            flag = True
            return flag
        i += 1
        j += 1
    return flag


def my_sort(numbers):
    '''
    指定规则排序  选择排序法
    :param numbers:
    :return:
    '''
    for i in range(0, len(numbers)-1):
        the_first = i
        for j in range(i+1, len(numbers)):
            if who_is_first(numbers[j], numbers[the_first]):
                the_first = j
        temp = numbers[i]
        numbers[i] = numbers[the_first]
        numbers[the_first] = temp
    return numbers
numbers = list(map(int, input().split(',')))

for num in my_sort(numbers):
    sys.stdout.write(str(num))


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值