Python练习题1

原题:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

扩展:求N个数字集合组成的所有M位数

思路:先确定各个数字的位置,然后进行组合

# _*_  coding:utf-8 -*-
'''
Created on 2017年7月21日

@author: I'python
'''
global long_list#数字与其对应的位置列表
global NUM#数字总个数
global BIT#结果位数
global result_set#最终结果集合

def cacl_place(num_list):  
    aux_list = num_list
    for idx, item in enumerate(aux_list):   
        tmp_list = aux_list[0:idx]       
        tmp_list.extend(aux_list[idx+1:])
        new_dic = [item,len(tmp_list)]#计算数字与其对应的位置
        if len(tmp_list) == (NUM-1) or len(tmp_list) < BIT:#过滤不符合位置条件的结果
            long_list.append(new_dic)
        if len(tmp_list) > 1:
            cacl_place(tmp_list)


def get_result():
    rst = 1
    for item in long_list:
        if(item[1] == (NUM - 1)):#处理最高位
            rst = (rst // (10 ** (BIT-1))) * (10 ** (BIT-1))#清零该位及后面的位
            rst = item[0] * (10 ** (BIT-1))
        else:#处理低位 
            rst = (rst // (10 ** item[1])) * (10 ** (item[1]))#清零该位及后面的位
            rst += (item[0] * (10 ** (item[1]-1)))
        if item[1] == 1:
            result_set.add(rst)


if __name__ == '__main__':
    NUM = 5
    BIT = 3
    result_set = set()
    long_list = []
    num_list = [1, 2, 3, 4, 5]
    cacl_place(num_list)
    get_result()
    print '共' + str(len(result_set)) + '个结果:'
    print sorted(result_set)


你可能感兴趣的:(Python练习)