Re: [讨论] 排列组合的算法解题

楼主: SocketAM2 (AM2)   2020-09-01 10:50:07
基本想法是一个个位数iterate过去
有个简单的剪枝手段:不可能达成4个的时候就不用往下数了
例如10000xx,最多就3个数
再来是个简单的算小计手段:已经数到四个数了,剩下的位数只能在已知最大值之内
例如1234xyz中的xyz各能在(0,1,2,3,4)中任选,所以这类共5^3=125个
我试了下python,光用上面这两招没特别雕语法
大概可以跑在一秒多
原po可以参考看看
还有版友想得到其他有效手段吗?
刚刚又发现一个不错的手段:建表查表
例如前面算过1234xyz这类共125个
建个表,key是“ 前四位数最大为4,且已经数到4个数了”,值是125
以后再碰到这种case就直接小计125
遇到表上没有的就往下拆分算完再加进表内
加上这招可以压到0.03秒左右
※ 引述《applebeing (苹果人)》之铭言:
: 求职时线上测验的问题,有算出解答,但觉得应该有更好的解法,
: 向各位版友请教解题想法。
: 问题如下:
: 一个七位数的数字,从第七位到个位数的顺序开始比对。
: 若当前位数的值,不小于曾出现过的数的最大值,就记录起来。
: 请问纪录结果为四个数字的可能组合数有几组?
: 例:
: 2334849 - 由左至右
: 第一位数 2 加入纪录
: 第二位数 3 大于等于2,加入纪录
: 第三位数 3 大于等于3,加入纪录
: 第四位数 4 大于等于3,加入纪录
: 第五位数 8 大于等于4,加入纪录
: 第六位数 4 不纪录
: 第七位数 9 大于等于8,加入纪录
: 纪录结果为 6
: 6429748 - 纪录 69 (2个数)
: 4629889 - 纪录 4699(4个数)
: 各位数可以为 0,例如 0001234、0007899 也符合要求。
: 我用循环跑 1~一千万涵盖七位数,每个数字都检查纪录结果,得出组数。
: 跑了五分多钟,很笨也很没有效率。
: 想请问是否有更效率的解题方式?
: 请大家指教,感谢!

Links booklink

Contact Us: admin [ a t ] ucptt.com