js面试常考算法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script>
			//冒泡算法,这里用两个循环实现
			function bubbleSort(arr){
				var val;
				for(var a = 0;a<arr.length;a++){
					//b=1说明:因为自身是不用比较的,那就从1开始;arr.length-a说明:是因为循环一轮之后,
//					就有一个数被排序好到最后,-a呢,最后这个就不用比较了,由此类推
					for(var b = 1;b<arr.length-a;b++){
						if(arr[a]>arr[a+b]){
							val = arr[a];
							arr[a] = arr[a+b];
							arr[a+b] = val;
						}
					}
				}
				return arr;
			}
			console.log('冒泡排序:'+bubbleSort([2,1,3,6,5,4,10]));
			//快排,核心思想:把数组分为两组,取中间一个数,小于或大于这个数的放左边数组,否则放右边,然后不断的递归重复的操作,到了递归的尾部,
//			就会开始把排好的数组组装好再归回来,这要求对递归有一定的了解,不然理解不了
			function quickSort(arr){
				if(arr.length<2){
					return arr;
				}
				var left = [],right = [],conter,conterIndex;
				conterIndex = Math.floor(arr.length/2);
				conter = arr.splice(conterIndex,1)[0];
				for(var a = 0;a<arr.length;a++){
					if(arr[a]<=conter){
						left.push(arr[a]);
					}else{
						right.push(arr[a]);
					}
				}
				return quickSort(left).concat([conter],quickSort(right));
			}
			console.log('快排:'+quickSort([4,2,3,1,5]));
			//用二分法查找指定的数
			function check(arr,val){
				var low = 0,len = arr.length-1,index = 0;
				while(low<=len){
					index = Math.floor((len+low)/2);
					if(arr[index]==val){
					   return index;
					}
					//若值大于目标值,则当前索引-1往后的索引值全不要,就是说当前索引值和后面的肯定是大于目标值的,故无需查找
					if(arr[index]>val){
						len = index-1;
					}else{
						若值小于目标值,则当前索引值+1往前的索引值全不要,就是说当前索引值和前面的肯定是小于目标值的,故无需查找
						low = index+1;
					}
				}
				return -1;
			}
			console.log('二分查找:'+check([1,2,3,4,5,6,7,8,9],2));
			//去重
			function filter(arr){
				var j = {},res = [];
				for(var a = 0;a<arr.length;a++){
					if(!j[arr[a]]){
						//json里面没有就存1,很简单不说了
						j[arr[a]] = 1;
						res.push(arr[a]);
					}
				}
				return res;
			}
			console.log("去重:"+filter([3,4,5,4,3,2,4]));
            function copy(obj){
            	var buf;
            	if(obj instanceof Array){
            		buf = [],i = obj.length;
            		while(i--){
            			//把数组递归出去,再返回它的元素
            			buf[i] = copy(obj[i]);
            		}
            		return buf;
            	}else if(obj instanceof Object){
            		buf = {};
            		for(var k in obj){
            			//把数组递归出去,再返回它的元素
            			buf[k] = copy(obj[k]);
            		}
            		return buf;
            	}else{
            		//其他数据原样返回
            		return obj;
            	}
            }
            console.log("复制:"+copy([1,2,3,4,5])[1]);
            //给字符串加空格返回
			function addChar(str){
				var res = '';
				for(var a = 0;a<str.length;a++){
					res+=str.charAt(a)+' ';
				}
				//返回之前去掉最后一个空格
				return res.substring(0,res.length-1);
			}
			console.log('给字符增加空格:'+addChar('abcdef'));
		</script>
	</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值