算法练习题(2):求两个数组合的第k个数

'''
有两个数m和n,可以组合成任意的数,将组合成的输入按从小到大排列,求第t个数是多少
输入:两个数,第t个数
输入:3 8 5
输出:83
因为:3 8可以组成
3 8 33 38 83 88....
输入:3 7 100
输出:733737
'''
'''
方法一:可以看出第二组的四个数是由第一组的两个数生成的
        第3组的8个数是由第二组的4个数生成的
        依次类推,我们用count计算推到第几个数了
        arr1记录前一个数组
        arr2记录后一个数组
        arr记录m和n
'''
def find_two_t(m,n,t):
    min_num,max_num=min([m,n]),max([m,n])
    if t==1:
        return min_num
    if t==2:
        return max_num
    #arr1记录开始的数据 arr2记录新生成的数组
    arr1=[]
    arr2=[]
    arr1=[min_num,max_num]
    count=2
    while True:
        for i in arr1:
            arr2.append(str(i)+str(min_num))
            count+=1
            if count==t:
                return str(i)+str(min_num)
            arr2.append(str(i)+str(max_num))
            count+=1
            if count==t:
                return str(i)+str(max_num)
        arr1=arr2
        arr2=[]
try: 
    m,n,t=map(int,input().split())
    print(find_two_t(m,n,t))
except:
    print('error')

结果:
在这里插入图片描述

'''
方法2:
我们发现一件事情由两个数组成的多位数是一个树模型
比如
             3                      8
        33        38             83       88
    333   338 383     388    833   838  883  888
相当于我们要找的树在第几层,这一层就是几位数,
我们先确定要找的树在第几层第几位,将3 8可以组成的位数进行一个全排列,并用arr1记录这一结果
最后对这个数组进行一个排序,取出第k个位置的树
'''
m,n,t=3,7,100
min_num,max_num=min(m,n),max(m,n)
a=2 #初始化层数的最大个数
b=0 #初始化层数
c=t #记录在该层数的位置数
#确定层数和位置树
while True:
    c=c-a
    
    b+=1
    if c-a*2<0:
        b+=1
        break 
    a*=2
#print(c,b)
arr=[str(min_num),str(max_num)]
def dfs(arr,dep,path,record):
    #dep 记录树的深度
    #path 记录合成数的长度
    #record 记录所有的数
    if len(path)==dep:
        record.append(''.join(path))
        return
    for i in arr:
        path.append(i)
        dfs(arr,dep,path,record)
        path.pop()
    return record
path=[]
record=[]
result_num=dfs(arr,b,path,record)
print(result_num[c-1])    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值