题目描述:
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
算法思路分析:
这个我能想到的就只有枚举法和排列组合结合了(如果里面还有更好的方法一定要对话框我!!!)
1、输入序列个数n,依次输入n个由abcdefghijkl乱序组成的序列;
2、从第j个字符开始依次与后面的(j,11)个字符依次进行大小比较如果第j个字符>(j,11)间的字符则,small+=1,而其余的(11-j)个字符;则可以随机排列,即(11-j)!;其实也就是双层循环。
3、这里的问题是abcdefghijkl均是单个的字符无法比较大小,只有数字可以比较大小,所以可以用这几个字符分别对应的ASCII码(ASCII码对应的大小顺序和字符排序一样,这个很重要)来表示他们的大小,python里面有这个求字符ASCII码的函数ord( );
4、最后就是计算了!
代码练习:
#/usr/bin/env.python
# -*- coding:utf-8 -*-
def factorize(num):
if num==0:
return 1
else:
return num*factorize(num-1)
if __name__ == '__main__':
n = int(raw_input())
for i in range(n):
s = raw_input()
index = []
for j in range(12):
index.append(ord(s[j])) #字符转换为ASCII码
out = 1
for k in range(12):
small = 0
for m in range(j,12):
if index[k] > index[m]:
small += 1
out += small * factorize(11 - j)
print out
基础知识备注:
1、黑板上的排列组合你舍得解开吗?
2、第一次用ASCII转换函数什么感觉:ord(),一万只草泥马奔腾而过!!!!!!;当然也可以用最简单的字典,自己指定大小,eg: key_list = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9, 'k': 10, 'l': 11}
3、当然这里的阶乘也可以调用math包中的求阶乘函数:
import math
math.factorial(11 - j)
---------------------------------------------------------------------------------------------------------------------------
详细内容请关注公众号:目标检测和深度学习
----------------------------------------------------------------------------------------------------------------------------