今天进行了CVTE的视频面试,总结一下;
- 要掌握好基础
- 算法编程一定要认真的分析好思路之后再下手;一定要在思路上走通,分析是很重要的一步
题目是这样的:
输出一个整数数组中出现次数第N多的整数。
2 7 4 10 15 7 2 10 3 7 4
7 3次
2 2次
4 2次
10 2次
15 1次
3 1次
编程实现如下:
var arr = [2,7,4,10,15,7,2,10,3,7,4];
var sortArr = function(arr,index){
var sortedArr = [];
var indexArr = [];
//使用对象对数据进行统计,要记得删除有个为undefined
//遍历数组,若存在于对象中,则加一,如果不存在,则将其值设为1;
var sortObj = {};
for(var i=0;i<arr.length;i++){
if(sortObj[arr[i]]===undefined){
sortObj[arr[i]]=1;
}else{
sortObj[arr[i]]++;
}
}
delete sortObj[undefined];
//分备用两个数组记录;
var j = 0;
for(var name in sortObj){
indexArr[j]=name;
sortedArr[j]=sortObj[name];
j++;
}
//根据其中count的排序,对两个数组进行同步排序;使用的是冒泡排序
var spanSort;
var spanIndex;
for(var k = 0;k<indexArr.length-1;k++){
for(var p=0;p<indexArr.length-1-k;p++){
if(sortedArr[p]<sortedArr[p+1]){
spanSort = sortedArr[p];
sortedArr[p] = sortedArr[p+1];
sortedArr[p+1]=spanSort;
spanIndex = indexArr[p];
indexArr[p] = indexArr[p+1];
indexArr[p+1]=spanIndex;
}
}
}
//对相同的数进行根据顺序的数据统计
var indexNum=[];
i=0;
indexNum[0]=1;
for(var s =1;s<sortedArr.length;s++){
if(sortedArr[s]===sortedArr[s-1]){
indexNum[i]++;
}else{
indexNum[++i]=1;
}
}
//寻找在indexArr中出现第n多的数的起始点;
var realIndex=0;
for(i=0;i<index-1;i++){
realIndex +=indexNum[i];
}
//将得到结果放置在一个数组中返回
var returnedArr = [];
i=0;
for(var q= realIndex;q<realIndex+indexNum[index-1];q++){
returnedArr[i]=indexArr[q];
i++;
}
return returnedArr;
};
var narr = sortArr(arr,2);
console.log(narr);
这个问题我的解决方案是有些复杂的,同仁,有没有更好的方法呢?