20240224华师大复试算法题 n个数凑最大

 很简单的思路就是按最高位最大的排,最高位一样比次高位。当然相等另外讨论。

这样还剩下一种特殊情况就是ABC。。。和AB这样的前n位一样后面多几位的情况。

比如ABC和AB比,这样就要比较C和A谁大

比如34和341比,就要排 34 341.

但是34和344比,就拍要344 34

如果多很多位呢ABCD和AB比

34和3419比,343419>341934

34和3441比,344134>343441

很明显就只要看多出的一位就可以了。

好,接下来我需要选取最高位的方法。

在python里一个选位好办法是把int转成str。然后按照索引[0]是最高位[1]是次高位。并且可以用负数选最低位,[-1]是最低位,[-2]是次低位。

最后就是排序了,这样n个数在这里,我们先找到按这样的比较法最大的排最前,然后再选第二大的。我想做两个列表,一个存初始的数,一个按顺序存结果。

n=int(input())
second_line=input()
num=[int(i) for i in second_line.split()]

python的话,可以这样写输入,再用len(num)做循环的次数判定的话,甚至可以不用这个n

然后把比较函数写一下

def compare(intA,intB):
    if(intA==intB):
        return intA
    strA=str(intA)
    strB=str(intB)
    if(len(strA)>len(strB)):
        size=len(strB)
        long='A'
    else:
        size=len(strA)
        long='B'
    k=0
    while(k<size):
        if(int(strA[k])>int(strB[k])):
            return intA
        if(int(strA[k])<int(strB[k])):
            return intB
        k=k+1
     # ABC vs AB情况
    if(k==size):
        if(long=='A'):
            if(int(strA(k))>int(strB(0))):
                return intA
            else:
                return intB
        if(long=='B'):
            if(int(strA(0))>int(strB(k))):
                return intA
            else:
                return intB

接着就是比较排序了

i=0
while(i<n):
    max_j=0
    max=num[0]
    j=0
    while(j<len(num)):
        if(num[j]==compare(num[j],max)):
            max=num[j]
            max_j=j
        j=j+1
    ans.append(max)
    num.pop(max_j)
    i=i+1

最后组合一下就可以了

i=0
strans=''
while(i<len(ans)):
    strans=strans+str(ans[i])
    i=i+1
print(strans)

通过,最后完整代码

def compare(intA,intB):
    if(intA==intB):
        return intA
    strA=str(intA)
    strB=str(intB)
    if(len(strA)>len(strB)):
        size=len(strB)
        long='A'
    else:
        size=len(strA)
        long='B'
    k=0
    while(k<size):
        if(int(strA[k])>int(strB[k])):
            return intA
        if(int(strA[k])<int(strB[k])):
            return intB
        k=k+1
     # ABC vs AB情况
    if(k==size):
        if(long=='A'):
            if(int(strA(k))>int(strB(0))):
                return intA
            else:
                return intB
        if(long=='B'):
            if(int(strA(0))>int(strB(k))):
                return intA
            else:
                return intB

n=int(input())
second_line=input()
num=[int(i) for i in second_line.split()]
ans=[]
i=0
while(i<n):
    max_j=0
    max=num[0]
    j=0
    while(j<len(num)):
        if(num[j]==compare(num[j],max)):
            max=num[j]
            max_j=j
        j=j+1
    ans.append(max)
    num.pop(max_j)
    i=i+1

i=0
strans=''
while(i<len(ans)):
    strans=strans+str(ans[i])
    i=i+1
print(strans)

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值