题目要求:有一个int型数组,里面有若干数字。要求统计出一共有多少种不同的数字?每种数字出现的频率?将数组按出现频率从少到多排列,频率相同则从小到大排列。**
解决方法一:
用一个数组来存储不同的数字及出现概率,逐一拿出数组中的数字和数组中的其他数字进行比较,相同则把相同的那个设为null,同时将该数字对应的出现次数加1,最后使用冒泡排序
js实现代码:
var NumberData=[1,4,5,7,8,3,1,6,4,8,4,6,9,410,12,15,12,6,20,12,5,7,8,5,2,4,1,5,6,3,10];
function CountNumberArray(){
var result=[];
result[0]=[];
result[1]=[];
var allDisNum=0;
var index=0;
//统计不同的数字
for (var i = NumberData.length - 1; i >= 0; i--) {
var temp=NumberData[i];
if(temp){
result[0][index]=temp;
result[1][index]=1;
for (var j = NumberData.length - 1; j >= 0; j--) {
if(temp==NumberData[j]&&j!=i){
result[1][index]+=1;
NumberData[j]=null;
}
}
index++;
}
}
//排序
for (var i = 0; i <result[1].length-1; i++) {
for(var j=i+1;j<result[1].length;j++){
var fcnt=result[1][i];
var fnum=result[0][i];
if(fcnt>result[1][j]|(fcnt==result[1][j]&&fnum>result[0][j])){
result[1][i]=result[1][j];
result[1][j]=fcnt;
result[0][i]=result[0][j];
result[0][j]=fnum;
}
}
}
}
解决方法二:
看了JavaScript红宝书之后,一回想这个题目,发现可以有另外一种新解法,就是用对象数组,用原生的sort来排序,统计出现次数的时候把这些数字都变成对象存入数组,两个属性,key:数字值,num:出现次数,代码如下:
var testArray=[5,2,3,4,5,4,5,6,7,8,2,3,4,1,2,3,4,5,6,7,8,9];
CountNumberArray(testArray);
function CountNumberArray(value){
var tempObjectArray=[];
var o={};
o.key=value[0];
o.num=1;
tempObjectArray.push(o);
for(var i=1;i<value.length;i++){
for(var j=0;j<tempObjectArray.length;j++){
if(tempObjectArray[j]&&tempObjectArray[j].key===value[i]){
tempObjectArray[j].num++;
break;
}
if(j==tempObjectArray.length-1){
var o=new Object();
o.key=value[i];
o.num=1;
tempObjectArray.push(o);
break;
}
}
}
function compare(object1,object2){
if(object1.num<object2.num){
return -1;
}else if(object1.num>object2.num){
return 1;
}else{
if(object1.key<object2.key){
return -1;
}else if(object1.key>object2.key){
return 1;
}
}
}
var result=tempObjectArray.sort(compare);
console.log(result);
}
以上两种解法貌似还是太复杂了,但我目前也还没想到提高效率的