算法优化
现在对JS的要求并不是代码能实现效果就行了,还要讲究代码简洁,算法也要优化,而什么样的算法是好的呢?首先,必须要实现效果这是前提;在实现效果之后还要看代码执行的次数,比如一些常用的循环,我们得考虑如何优化算法来减少循环的次数,这就需要更强的功底才能做到,我们要向这方面看齐。
计算机语言的相通性
有人说只要你学会一种语言后,在学其他的语言都能很快上手。这是有一定道理的,比如,在你学过c,和java时,在学js,你会发现你很快就能上手,可能语法有些不一样,但逻辑是共通的。所以培养自己的逻辑是学好一门编程语言的重要的方面。
算法优化举例
这是一个在c语言里经常出现的题目,今天我们使用js来实现它。
求所有三位数的各个位上的数值之和出现的次数。如 345 和值 3+4+5 = 12。 最小和值是1(100的和值),最大和值是27(999的和值)。统计和值1-27各出现了多少次。
我们先看看第一种算法:定义两个数组:arr是盛放100 ~ 999的所有数,arr1是盛放1 ~ 27出现的次数。使用两个for循环,第一个for循环控制1~27和值,第二个循环遍历100 ~ 999,使用变量sum记录每个和值出现的次数。
var arr =[];
var arr1 = [];
for(var j = 1;j <=27;j++){
var sum = 0;
for(var i = 100;i <=999;i++){
arr[i] = i;
var g = arr[i] % 10;
var s = parseInt(arr[i] / 10) %10;
var b = parseInt(arr[i] / 100) %10;
if(j == g + s + b){
sum++;
}
}
arr1[j-1] = sum;
}
console.log(arr1);
上面的算法就是当和值为1时,把100 ~ 999遍历一趟;当和值为2时,又把100 ~ 999遍历一遍;以此类推...解决这个问题需要计算机至少执行27*900次。
算法二:定义一个长度为27的数组arr,首先将数组里盛放27个0,在使用for循环遍历一遍100 ~ 999,使用下标巧妙地记录和值出现的次数。
var arr = [];
var sum = 0;
for(var i = 0 ;i < 27;i++){
arr[i] = 0;
}
for(var i = 100;i < 1000;i++){
var g = i % 10;
var s = parseInt(i / 10) %10;
var b = parseInt(i / 100) %10;
var sum = g + s + b;
arr[sum-1]++;
}
for(var i = 0; i < 27; i++){
console.log("和值" + (i+1)+ "出现次数:" + arr[i]);
}
算法二代码看起来和算法一差不多,但它只需要遍历900次,比起27*900少了很多遍。
所以编写js代码时,首先自然是实现效果,然后就要考虑算法的优化,但这个不是一蹴而就的,要不断地练习才能做到,我们可以把它当做一个目标,一步一步向他靠近