Python实训作业,python程序设计实训报告总结
丑数问题及变种综述
发表声明
1判断丑的数量
因子只包含2、3、5的数字称为丑号,1作为初始丑号用于面试。
lint代码517 uglynumbersegmentfault
指剑锋题34的丑号排列。
解决方法:参考剑指的报价,将判断对象按2、3、5的顺序连续划分,最后得到1,证明数字难看;使最优化
//*
*按照2、3、5的顺序划分判断(2、3、5的顺序判断时间最好))))))))))))))。
* http://www . lint code.com/zh-cn/problem/ugly-number
*题目:判断一个数字丑不丑。
* @作者yzwall
*/
类别解决方案{
publicbooleanisugly(intnum ) {
if(num==0)(
假的;
() ) ) ) )。
if(num==1) {
返回true
() ) ) ) )。
wile(num%2==0) {
num/=2;
() ) ) ) )。
wile(num%3==0) {
num/=3;
() ) ) ) )。
wile(num%5==0) {
num/=5;
() ) ) ) )。
返回数==1?真:假;
() ) ) ) )。
() ) ) ) )。
求2k丑数。
lintcode 4丑陋的数字iies5
剑锋指题34丑数扩充。网
丑陋数字推理
根据丑数的定义,推论如下。
取任意难看的数字$m$并记录$m2=mtimes2$,$m3=mtimes3$,$ m5=mtimes5 $代码。
$m2$,$m3$和$m5$一定是丑陋的博客。
如果$m$是当前的$n$丑数,则$m2$、$m3$和$m5$的最小值必须是$n 1$丑数。长队
2.1解决方案1:o(nlogn)$时间复杂度
丑号推理的结果显示,当前的$n$丑号保存在PriorityQueue的开头,使用哈希表HashSet保证优先级队列中的丑号不重复。
//*
*标题:找到第n个丑陋的数字
* http://www . lint code.com/zh-cn/problem/ugly-number-ii
*解1:优先级队列HashSet解,时间复杂度O(nlogn)
* @作者yzwall
*/
类别解决方案13 {
publicinnthuglynumber(intn){
priorityqueuepq=newpriorityqueue(n,新的比较器) )
上市公司(龙o2,龙o2) {
返回o1 o2?-1 : 1;
() ) ) ) )。
);
HashSet hash=new HashSet(;
hash . add(1L);
PQ。申办(1L);
int [ ] primes=new int [ ] { 2,3,5 };
进入主程序3360主程序(for) {
hash . add()long)prime;
pq . offer())long)prime;
() ) ) ) )。
Min=素数[0];
for(intI=0;I n;I ) {
//min第11个丑号总是由优先级队列保证
min=pq . poll(;
进入主程序3360主程序(for) {
如果(!hash.contains(min*prime ) }
hash . add(min * prime);
//HashSet保证优先级队列中没有重复的丑号。
pq . offer(min * prime);
() ) ) ) )。
() ) ) ) )。
() ) ) ) )。
return(int)min;
() ) ) ) )。
() ) ) ) )。
2.2解决方案2:o(n)$时间复杂度
根据丑数推理,与方案2.1相比,
对于当前的$n$丑数$m$来说,会找到第一个超过$m$的$m2$、$m3$和$m5$,其中最小的一定是$n 1$丑数。
用数组保存生成的丑数,避免使用优先级队列和哈希表,将时间复杂度优化到$o(n) $,而空间复杂度仍然是$o)) n) $
部分代码参考了报价面问题34的丑数展开。
找3k自定义丑号。
自定义丑数的定义是正整数,所有素数因子都在一组给定大小为k的素数中。
如果素数集合指定为[2,7,13,19],[1,2,4,7,8,13,14,16,19,26,28,32]将是前12个超级丑的数。
自定义丑数是广义丑数,丑数的素数集合指定为[2,3,5]
lintcode 518 siper丑号
3.1解决方案1:o(nlogn)$时间复杂度
丑数推理,可以扩展到自定义丑数:
取任意自定义丑数$m$并指定$primes[]$,${m}_{i}=mtimes primes[i],i=0,1,2,primes.length-1$
${m}_{i}$必须是自定义的难看数字;
如果$m$是当前的$n$丑数,则${m}_{i}$的最小值必须是$n 1$丑数。
以上推理结果表明,当前$n$ th自定义丑号保存在PriorityQueue的开头,哈希表HashSet保证优先级队列中的自定义丑号不重复;
//*
*标题:找到第n个自定义丑号。
* http://www . lint code.com/zh-cn/problem/super-ugly-number
*解法1 :优先队列哈希特求解、时间复杂度o(nlogn),空间复杂度o (n)。
* @作者yzwall
*/
类解决方案{
publicinnthsupuglynumber(intn,int[]素数).
priorityqueuepq=newpriorityqueue(n,新的比较器) )
公共公司(长氧气,长o2 ) {
返回o1 o2?-1 : 1;
() ) ) ) )。
);
HashSet hash=new HashSet(;
哈希。添加(1L);
PQ .出价(1L);
输入主程序3360主程序(for ) {
哈希。加()长)素数;
pq。offer())long)prime;
() ) ) ) )。
长最小值=素数[0];
for(intI=0;I n;I ) {
min=pq。poll(;
输入主程序3360主程序(for ) {
如果(!hash.contains(min*prime ) }
哈希。add(min * prime);
pq。offer(min * prime);
() ) ) ) )。
() ) ) ) )。
() ) ) ) )。
返回(int)min;
() ) ) ) )。
() ) ) ) )。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。