9.7数学与概率(五)——功能:有些数的素数因子只有3、5、7,找出其中第k个数

/**

* 功能:有些数的素数因子只有3、5、7,找出其中第k个数。

*/

两种方法:

方法一:

/**
	 * 思路:将列表中的数字与3,5,7相乘,找出还未加入列表的最小数。
	 * 每次要将Ai加入列表时,就用某个临时列表存放3Ai,5Ai和7Ai。要产生Ai+1时,搜索临时列表,找出最小值。
	 * @param k
	 * @return
	 */
	public static int getKthMagicNumger(int k){
		if(k<0)
			return 0;

		int val=1;
		Queue q=new LinkedList<Integer>();
		addProducts(q,1);
		for(int i=0;i<k;i++){
			val=removeMin(q);
			addProducts(q,val);
		}
		return val;
	}

	public static void addProducts(Queue<Integer> q,int v){
		q.add(v*3);
		q.add(v*5);
		q.add(v*7);
	}

	//取出最小值
	public static int removeMin(Queue<Integer> q){
		int min=q.peek();
		for(Integer v:q){
			if(v<min){
				min=v;
			}
		}
		while(q.contains(min)){
			q.remove(min);
		}
		return min;
	}

方法二:

	/**
	 * 思路:(优化)从一开始就按常数因子将列表分组存放,那就只需检查3,5,和7倍数的第一个,后续元素一定比第一个大。
	 * 当这些元素在其他列表中不存在是,将其插入列表。
	 * 伪代码如下:
	 * 		1)初始化array和队列:Q3,Q5和Q7。
	 * 		2)将1插入array.
	 * 		3)分别将1*3,1*5,1*7插入Q3,Q5和Q7。
	 * 		4)令x为Q3,Q5和Q7中的最小值。将x添加至array尾部。
	 * 		5)若x存在于:
	 * 			Q3:将x*3,x*5,x*7放入Q3,Q5和Q7,从Q3中移除x。
	 * 			Q5:将x*5,x*7放入Q5和Q7,从Q5中移除x。
	 * 			Q7: 将x*7放入Q7,从Q7中移除x。
	 * 		6)重复4~6,直到找到第k个元素。
	 * @param k
	 * @return
	 */
	public static int getKthMagitNumber2(int k){
		if(k<0)
			return 0;

		int val=1;
		Queue<Integer> queue3=new LinkedList<Integer>();
		Queue<Integer> queue5=new LinkedList<Integer>();
		Queue<Integer> queue7=new LinkedList<Integer>();
		queue3.add(1);

		for(int i=0;i<k;i++){
			int v3=queue3.size()>0?queue3.peek():Integer.MAX_VALUE;
			int v5=queue5.size()>0?queue5.peek():Integer.MAX_VALUE;
			int v7=queue7.size()>0?queue7.peek():Integer.MAX_VALUE;

			val=Math.min(v3, Math.min(v5, v7));
			if(val==v3){
				queue3.remove();
				queue3.add(val*3);
				queue5.add(val*5);
			}else if(val==v7){
				queue5.remove();
				queue5.add(val*5);
			}else if(val==v7){
				queue7.remove();
			}
			queue7.add(val*7);
		}

		return val;
	}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 15:40:37

9.7数学与概率(五)——功能:有些数的素数因子只有3、5、7,找出其中第k个数的相关文章

剑指Offer(Java版)第六十五题:给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

/*给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4.*//*二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值*///思路:从最左边的叶子节点开始找起. import java.util.*; public clas

数学1——概率与数学期望

1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量的期望值是试验中每一次可能出现的结果的概率乘以其结果的总和. 这是什么意思呢?假如我们来玩一个游戏,一共52张牌,其中有4个A.我们1元钱赌一把,如果你抽中了A,那么我给你10元钱,否则你的1元钱就输给我了.在这个游戏中,抽中的概率是$\frac{1}{13} ( \frac{4}{52} ) $,结果是赢10元钱:抽不中概率是$\frac{12}{13}$,结果是亏1元钱.那么你赢的概率,也就是期望值是$-

POJ3682King Arthur&#39;s Birthday Celebration(数学期望||概率DP)

King Arthur is an narcissist who intends to spare no coins to celebrate his coming K-th birthday. The luxurious celebration will start on his birthday and King Arthur decides to let fate tell when to stop it. Every day he will toss a coin which has p

《统计思维程序员数学之概率统计第2版》中英文PDF+数据代码+《面向数据科学家的实用统计学》中英文PDF+源代码+学习总结

作为一个程序员,我认为,不需要把数学全部学完,要选择合适自己的资料. <统计思维:程序员数学之概率统计(第2版)>以程序模拟的方式而不是数学教材上毫无来由的定理解释了大多数统计上的基本概念.<统计思维:程序员数学之概率统计(第2版)>,中文PDF,带书签目录,204页,文字可以复制.<统计思维:程序员数学之概率统计(第2版)>,英文PDF,带书签目录,225页,文字可以复制. 配套python源代码+数据. 下载:https://pan.baidu.com/s/1Jju

9.7数学与概率(三)——在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分

/** * 功能:在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分. * 假定正方形的上下两条边与x轴平行. */ /** * 考虑: * 线的准确含义,可能性有: * 1)由斜率和y轴截距确定: * 2)由这条边上的任意两点确定: * 3)线段,以正方形的边作为起点和终点. * * 假设:这条线的端点应该落在正方形的边上. * 思路:要将两个正方形对半分,这条线必须连接两个正方形的中心点. */ public class Square { //正方形的四条边 int lef

9.7数学与概率(四)——在二维平面上,有一些点,请找出经过点数最多的那条线

/** * 功能:在二维平面上,有一些点,请找出经过点数最多的那条线. /** * 思路:在任意两点之间画一条无线长的直线,用散列表追踪那条直线出现的次数最多.时间复杂度O(N*N) * 注意: * 1)用斜率和y轴截距来确定是否是同一条直线. * 2)浮点数不一定能用二进制数准确表示,因此检查两个浮点数的差值是否在某个极小值(epsilon)内. * 3)对于散列表而言,斜率相等,未必散列值相同.因此,将斜率减去一个极小值,并以得到的结果flooredSlope作为散列键. * 4)取得所有可

9.7数学与概率(七)——检查n能否被素数整除

/** * 功能:检查n能否被素数整除. */ /** * 生成素数序列:埃拉托斯特尼筛法 * 原理:剔除所有可能被素数整除的非素数. * 思路:列出到max为止的所有数字. * 1)划掉所有可能被2整除的数(2保留). * 2)找到下一个素数(即下一个不会被划掉的数),并划掉所有可被它整除的数. * 3)最终得到2到max之间的素数序列. * 可优化为:只将奇数放进数组,空间即可减半. * @param max * @return */ public static boolean[] siev

答读者问(5):有关数学对程序员的作用、研发工作岗位要求和实习对找工作的影响等问题

最近,有很多读者通过微博.微信与本人交流.感觉大家对于学习.对于技术都非常的有热情,让我也学到了很多东西. 我提取了几个大家比较关心的问题予以答复,请有相同疑问的朋友参考一下. 问题1:数学对程序员重要吗? 答复:要回答这个问题,我举一个身边的例子. 我们项目组有两个同时入职的员工(比我晚一年入职),一个是研究生毕业,一个是本科毕业.前者在校成绩很好,几乎每门数学课都考了90分以上:后者在校成绩马马虎虎,但据说写程序很厉害.他们同时进行入职培训,同样有指导老师教,同时转正.大半年之后,我无意间打

[家里蹲大学数学杂志]第041期中山大学数计学院 2008 级数学与应用数学专业《泛函分析》期末考试试题 A

1 ( 10 分 ) 设 X 是 Banach 空间, f 是 X 上的线性泛函. 求证: f∈L(X) 的充分必要条件是 N(f)={x∈X; f(x)=0} 是 X 的闭线性子空间. 证明: 必要性. 设 N(f)?xn→x , 则 f(x)==limn→∞f(xn)(f∈X?)limn→∞0=0. 充分性. 用反证法. 若 f 无界, 则 ? n∈N, ? xn∈X, s.t. |f(xn)|>n∥xn∥, 而 ∥∥∥xnf(xn)∥∥∥<1n.(1) 令 yn=xnf(xn)?x1f(