关于JS你不得不知道的几个小算法。(-)

分享几个面试中比较常见的小算法。

1.交换两个变量的值(不使用第三方变量)。

  方法一:

      var a = 111;
      var b = 333;
        a = a + b;  // 先把a赋值为啊a,b的和。
        b = a - b;  // 两个数的和减去其中一个数,结果就是另一个数。  
        a = a - b;  // 同理可得另外一个  
 方法二:(等同于上面,但感觉和的形式更容易理解)
        a = a - b;  // 先使a等于a,b的差
        b = a + b;
        a = b - a;
方法三:
        a = {a:b,b:a};  // 先把a变成个对象,通过键值对的形式保存着交换后的值
        b = a.b;     // 然后赋值
        a = a.a;
方法四:(类似于上面方法)
        a = [a,b];   // 通过数组的形式
        b = a[0];    // 注意这里只能先获取b的值,若先获取a的值,数组失效,则b的值为undefined
        a = a[1];
2.斐波那契数列(也叫黄金分割比例数列)
    function getFib(n) {                // 斐波那契数列的规律  1 1 2 3 5 8 13 21...  前两个数的和等于第三个数
    			var num1 = 1;   
    			var num2 = 1;
    			var num3;
    			for(var i = 3; i <= n; i++ ) {
    				num3 = num1 + num2;
    				num1 = num2;
    	                	num2 = num3;       
    			   }
    				return num3;
    			}
    			var sum = getFib(10);                                          
3.冒泡排序
方法一:(先找小的)

                 var numbers = [7,9,6,8];
		 for(var i = 0; i < numbers.length - 1; i++) {      // 外层循环控制趟数
                     var isSort = true;  // 定义一个标记判断是否完成排序
		 	for(var j = i + 1 ; j <= numbers.length - 1 ; j++) { 
		 		if(numbers[i] > numbers[j]) { // 拿前一个数依次跟后面每个数比较,把小的放在前面,每一趟都找到一个最小值
                                     isSort = false;
		 			var tmp = numbers[i];
		 			numbers[i] = numbers[j];
		 			numbers[j] = tmp;
		 		}
		 	}
             if(isSort) {
               break;
             }
		 }
方法二:(先找大的)
                var numbers = [7,9,6,8];
    	     for(var i = 0; i < numbers.length - 1 ; i++) { // 外层循环控制趟数
    	 	    var isSort = true;                      // 定义一个标记判断是否完成排序
    	 	    for(var j = 0; j < numbers.length -1 - i; j++) {
    	 		if(numbers[j] > numbers[j+1]) {  // 相邻两个数比较,每次都把大的放后面,每一次遍历找到一个最大值
    	 			isSort = false;
    	 			var tmp = numbers[j];
    	 			numbers[j] = numbers[j+1];
    	 			numbers[j+1] = tmp;
    	 		    }
    	 	    }
    	 	    if(isSort) {
    	 		break;
    	 	    }
    	     }
方法三:( es5 sort())
var arr = [1, 1000 , 5, 55, 540, 22]
document.write(arr.sort())  // 不不不怎么可能这么简单,

 sort()默认情况下是对字符编码从小到大排序。对应的是Unicode码,而字母数字则对照着ASCII码。是不是有点蒙,简单的说

 就是字符串可以直接进行排序,而数字则需要设定规则。

接下来模拟一下sort()实现原理

function sort(numbers, fn) {
        for(var i = 0; i < numbers.length - 1 ; i++) {
            var isSort = true;
            for(var j = 0; j < numbers.length -1 - i; j++) {
                if(fn(numbers[j],numbers[j+1]) > 0) {
                    isSort = false;
                    var tmp = numbers[j];
                    numbers[j] = numbers[j+1];
                    numbers[j+1] = tmp;
                }
            }
            if(isSort) {
                break;     
            }
        }
    }
    numbers = [7,9,6,8];   
     sort(numbers, function (a, b) {
          return a - b
     });      //通过 a - b 或 b - a 判断从大到小排还是从小到大排

4.数组去重

var arr = [102, 333, 102,333, 102,9,102,6];
     var newArr = [];
     for(var i = 0; i < arr.length; i++) {  // 先拿数组中第一个数和后面所有数进行对比,如果相同跳过,直至没有相同放进新数组。
     	for(var j = i + 1; j < arr.length; j++) {   //  重复上面步骤
     		if(arr[i] === arr[j]) {
     			j = ++i;   //  此处注意区分 ++i 和 i++ 的区别。
     		}
     	}
     	newArr[newArr.length] = arr[i];
     }

暂时先写到这里,下次继续。




    

     

猜你喜欢

转载自blog.csdn.net/zero________________/article/details/80099240