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