`
v5qqbrowser
  • 浏览: 356557 次
文章分类
社区版块
存档分类
最新评论

js,将一个整数数组先按照因子数量排序,再按照数字大小排序

 
阅读更多

某笔试中的题,不得不承认这道题是个好题,考察了很多方面。js的数组操作,算法,逻辑能力,还有预防各种坑的能力……

一共搞了大概有4小时,函数逐个用firebug测,无法想象在考场上大概不到1小时,还不能调试……能写对的绝对是个神。公司遇到这样的神,就算其他题都不写也应该收了。


/*说明:将若干个正整数进行排序。排序方式为先按照因子数量从大到小排列,对于因子数量相同的按照值从大到小排。
比如数列[6,8,12,1,9,50],6的因子有1,2,3,6,因子数量为4;8的因子有1,2,4,8,因子数量为4.
按照因子数量排列的结果是[12,50,6,8,9,1]。对于因子相同的数比如12和50,按照从大到小排列,也就是说排列为50,12

需要注意的js的参数传递的特点:
1、可以在函数中直接改变它能够看到的变量和数组的值
2、数组的时可以通过传递进函数直接改变(类似于指针)
3、变量的值则不同,不能通过函数改变传入的值(和c语言相同)

总结一下里面的坑:
1、求因子数量。对于n=1的情况,只有一个因子。对于n是平方数的情况,平方数项是一个因子。除此以外的其他情况是两个因子
2、求因子数量里面是i<=Math.floor(Math.sqrt(n)),注意等号
3、del(arr,key)中,删除掉一个数字,要使指针前移一位 (此函数后来没有使用)
4、局部变量和全局变量的名字不要相同
*/
var a=[6,8,12,1,9,50,49,3,2,30];
showarray(a);
var sorted = new Array();
sortFactorValue();
showarray(a);
function sortFactorValue()//按照因子数量排列
{
	var f = new Array(a.length);
	getFactor(f);	//获取数字对应的因子数
	sortByFactor(f);  //获取一个因子数量从大到小的排列
}

function getFactor(f)	//获取每个数的因子数量
{
	for(var i=0;i<a.length;i++)
	{
		f[i]=countFactor(a[i]);
	}
	
}

function countFactor(n)	//获取数字n的因子数量
{
	if(n==1)
		return 1;
	var f=2;
	for(var i=2;i<=Math.floor(Math.sqrt(n));i++)
	{	if(n%i==0)
		{	if(Math.floor(Math.sqrt(n))==Math.sqrt(n))
			{	f+=1;}
			else
			{	f+=2;}
		}
	}
	return f;
}

function sortByFactor(f)	//按照因子值将因子序列和数列从大到小排列
{
	
	var i=0;
	while(i!=f.length)
	{	var start=i;
		var mf= Math.max.apply(Math,f.slice(i,f.length));
		i=findAndSwap(f,i,mf);	//对于数组f从第i位开始,找到因子数最大的数,将其交换到最前面,并且使i增加1。运行一次后最前面的若干个数都是待排序的因子最大数
		sortByValue(start,i);	//对于同因子数量的数字按值排列,排完之后i前面的数都是完成排序的数
	}
}

function findAndSwap(f,i,mf)	//从数组f的第i位开始,找到值为mf的数,将其交换到最前面,并且使i增加1
{
	for(var j=i;j<f.length;j++)
	{
		if(f[j]==mf)	//如果该数因子数量最大,将其换到最前面,并且让标志位i加1,i之前的所有数字已经是按factor排好的
		{
			if(j==i)	//如果该数就是第一个数,就不需要换了,直接移动指针
			{	i++;}
			else
			{	var p;	//如果该数不是第一个数,将它换到第一位,然后移动指针,进入下一循环比较后面的数列
				p=f[j];f[j]=f[i];f[i]=p;
				p=a[j];a[j]=a[i];a[i]=p;
				i++;
			}
		}
	}
	return i;
}

function sortByValue(s,e)  
//将数组a中从s开始到e为止的子数组进行排序
//这个函数的思路和findAndSwap是一致的,都是找到最大的数并将其换到第一位。如果数据结构足够合理,这两个函数应该可以合并
{
	while(s!=e)
	{
		var max=Math.max.apply(Math,a.slice(s,e));
		for(var i=s;i<e;i++)
		{
			if(a[i]==max)
			{
				if(i==s)
				{	s++;}
				else
				{
					var p;
					p=a[i];a[i]=a[s];a[s]=p;
					s++;
				}
			}
		}
	}
}
/*function factorList(f)	//获取该数列因数个数从大到小的排列
//开始的想法是先找到因子序列然后再遍历一次数组,后来发现重复遍历了,太麻烦
{
	var fl = new Array();
	var t = new Array();
	t = t.concat(f);
	while(t.length)
	{	
		var mf= Math.max.apply(Math,t);
		
		fl.push(mf); //将最多因子数放入数组
		del(t,mf);	//将最多因子的数从数组中删掉
	} 
	return fl;
}*/

function del(arr,key)	//从数组a中删除值为key的所有数字,注意变量名不能和公有变量相同
{	
	for(var i=0;i<arr.length;i++)
	{	
		if(arr[i]==key)
		{	arr.splice(i,1);	//因为删掉了一个数,所以位置要往前移动一个
			i--;
		}
	}
}
function showarray(a0)  //输出数组
{
	for(var i=0;i<a0.length;i++)
	{
		document.write(a0[i]+" ");
	}
	document.write("</br>");
}


分享到:
评论

相关推荐

    java求一个整数的因子.rar

    java求一个整数的因子.rar

    java求一个整数的因子.7z

    java求一个整数的因子.7z

    9718整数因子分解

    将第一个因子为2的分解个数,加上第一个因子为3的分解个数,...,直至加到第一个因子为12的分解个数. 而第一个因子为2的分解个数又是多少呢?是6(因为12/2=6)的分解个数,递归求解! 可用“递归”和“备忘录方法”两种...

    整数因子分解问题(分治法\C++实现)

    将第一个因子为2的分解个数,加上第一个因子为3的分解个数,...,直至加到第一个因子为12的分解个数. 而第一个因子为2的分解个数又是多少呢?是6(因为12/2=6)的分解个数,递归求解! 可用“递归”和“备忘录方法”两种...

    单因子组合排序分析(量化因子回测代码)

    持有期为一个月。在持有期结束时重复上述过程以持有新组合。从而得到每个组合的收益率 时间序列。如果多空组合具有显著的超额收益,那么该因子便是有效的因子(由于A股市场 的做空限制较多,所以也可以只考虑多头...

    java求一个整数的因子源码

    java求一个整数的因子源码

    9718 整数因子分解

    将第一个因子为2的分解个数,加上第一个因子为3的分解个数,...,直至加到第一个因子为12的分解个数. 而第一个因子为2的分解个数又是多少呢?是6(因为12/2=6)的分解个数,递归求解! 可用“递归”和“备忘录方法”两种...

    将一个整数分解为两个数的积-comdiv.m

    将一个整数分解为两个数的积-comdiv.m 本程序可以将一个整数分解为两个整数的积,这两个整数同时是这个整数的最大因子,如250=25*10,255=17*15;

    C语言入门习题:寻找完数(输出形式为“数字,数字,……,数字”)

    完数是指一个整数恰好等于它的因子之和(除自身外),则称这个数为完数。从键盘先后输入两个不大于9999的正整数m和n,若m&gt;n,则交换两数。然后求m~n(m和n均为正整数且m≤n)之间的所有完数。 【输入形式】 先后...

    用递归函数求两个整数的最大公因子

    在C++中用函数递归调用的方法实现辗转相除法求两个整数的最大公因子。

    整数因子分解

    将第一个因子为2的分解个数,加上第一个因子为3的分解个数,...,直至加到第一个因子为12的分解个数. 而第一个因子为2的分解个数又是多少呢?是6(因为12/2=6)的分解个数,递归求解! 可用“递归”和“备忘录方法”两种...

    整数因子分解问题

    整数因子分解问题 问题描述:大于1的正整数n可以分解为n=x1*x2*x3*...*xn . 例如:当n=12时,一共有8种不同的分解式: 12=12 12=6*2 12=4*3 12=3*4 12=3*2*2 12=2*6 12=2*3*2 12=2*2*3

    关于整数的整数因子和问题的若干研究

    关于整数的整数因子和问题的若干研究

    java求一个整数的因子.zip

    java求一个整数的因子.zip

    计算因子个数

    计算两个大整数的和差积商,并计算出一个大整数的因子个数

    用c++做的整数因子分解问题

    用c++做的整数因子分解问题,当输入一个数时,输出他有几种分解方式。

    整数因子分解问题C/C++实现

    整数因子分解问题 算法设计思路: n=x1*x2*x3*…*xm,分治思想设计(分解过程): n=x1*(x2*x3*…*xm);...可以求出所有分解因子个数。 复杂性: 当n非素数时T(n)=O(logn); 当n是素数时T(n)=O(n); 所以T(n)=O(n)

    快速排序算法的简单实现

    快排算法的简单实现。... 快速排序原理:从一组数中任意选出一个数,将大于它的数放右边,小于它的数放左边,然后再从左边和右边的俩组数中分别执行此操作,知道组中元素数为1,此时,数组就是有序的了。

    用Python编写数学程序——计算整数因子

    Python数学编程:如何计算整数因子

Global site tag (gtag.js) - Google Analytics