分享几个面试中比较常见的小算法。
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]; }
暂时先写到这里,下次继续。