一.算法之数组去重
方法一
【简单思路实现】:依次拿出数组中的每一项和后边项比较,出现重复就删除(双for)
var ary[2,4,32,5,623,3,33]
function no_rep(ary){
for(var i=0;i<ary.length-1;i++){
var aaa=ary[i]
for(var j=i+1;j<ary.length;j++){
var bbb=ary[j]
if(aaa=bbb){
ary.splice(j,1)
j--;//解决splice造成的数组塌陷问题
}
}
}
ruturn ary;
}
console.log(no_rep(ary))
方法二:
【实现思路】利用对象属性名不重复的思想,去解决重复问题;通过空对象作为媒介,每循环一组把不重复的值放入空对象中,过程中通过对象属性名的值的判断,删除掉数组中对应元素
特点:解决空间复杂度和时间复杂度问题,加快渲染速度
var ary = [2,3,4,2,34,223,2,3]
function no_rep(){
for(var i=0;i<ary.length;i++){
var obj = {};
var value = ary[i];
if(obj['value']=='undefined'){
obj['value'] = 'value';
}else{
ary.splice(i,1);
i--;
}
}
return ary;
}
console.log(ary);
【优化方法】对于splice引起的数组塌陷问题,塌陷一次,后边元素就要依次改变,比较消耗性能
优化方法:
- 想办法让值删除后位置还会有元素占位
- 把末尾元素提到这个位置
- 最后一项删除
- 需要注意,拉过来的最后一项的值还需要比较需要i--
var ary[1,2,3,2,1,3]
for(var i=0;i<ary.length;i++){
var obj={};
var value=ary[i];
if(obj['value']=='undefined'){
ary[i]=ary[ary.length-1];
ary.length--;
i--;
continue;
}
obj[value]=value;
}
方法三:indexOf
创建一个新数组,遍历原数组,如果新数组中没有那一项,就把他push进去
/*
var ary2=[1,2,1,3,3,2,3];
var newAry=[];
把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组
*/
function unique(ary){
var newAry=[];
for(var i=0;i<ary.length;i++){
var item=ary[i];
if(newAry.indexOf(item)==-1){
newAry.push(item);
}
}
return newAry;
}
var ary2=[1,2,1,3,3,2,3];
var res=unique(ary2);
console.log(res);
二. 算法之冒泡排序
/*
冒泡排序:
从小到大排序
var ary=[8,2,1,5]
原理:依次拿出数组中的每一项给后面的一项做对比,如果当前项比后面的项大就交换位置
第一轮:[2,1,5,8] 经过一轮比较出现了最大数
第二轮:[1,5,2,8] 经过二轮比较得出倒数第2个数
第三轮:[1,5,2,8] 经过二轮比较得出倒数第3个数
.... 总共四项,经过比三轮,已经得到了三个最大数了,最后一个自然就是最小数
【需要比的总轮数】:ary.length-1;
【每次需要比的次数】:ary.length-1-已经比较过的轮数
第一轮:4项两两比较需要比3次:ary.length-1
第二轮: 正常的ary.length-1-已经比较过的轮数
*/
function sort(ary){
// 需要比较的轮数
for(var i=0;i<ary.length-1;i++){
for(var j=0;j<ary.length-1-i;j++){
var current=ary[j];
var next=ary[j+1];
if(ary[j]>ary[j+1]){
// 让 ary[j]=ary[j+1]
var temp=ary[j]
ary[j]=ary[j+1];
ary[j+1]=temp;
}
}
}
return ary;
}
var ary=[8,2,1,5];
var res=sort(ary);
三. 递归
自己调自己
function total(num){
if(num>10)return 0;
return num + total(num+1);
}
console.log(total(1));