Javascript算法练习(一)
反转字符串
方法一:split() + unshift() + join()
// 将__string反转返回 function myReverse ( __string ) { if ( !__string ) return; var aTarget = __string.split(""), // 将__string分割成单个字符,保存到数组中 aTmp = [], // 存放反转之后的字符串数组 iLen = aTarget.length; // __string数组长 for ( var i = 0; i < iLen; i++ ) { aTmp.unshift( aTarget[i] ); // 头部插入,压栈方式 } return aTmp; } console.log( myReverse( "Hello World!") ); // reverse.html:30 ["!", "d", "l", "r", "o", "W", " ", "o", "l", "l", "e", "H"] console.log( myReverse( "Hello World!").join("") ); // 组合成字符串 // reverse.html:33 !dlroW olleH
方法二:split() + 二分法
function dichotomy( __string ) { if ( !__string ) return; var iTmp = 0, aTarget = __string.split(""), // 转换成字符数组 iLen = aTarget.length, sTmp = ""; // 遍历数组,头尾交换 for ( var i = 0; i < iLen / 2; i++ ) { iTmp = aTarget[i]; aTarget[i] = aTarget[ iLen - i - 1 ]; aTarget[ iLen - i - 1 ] = iTmp; } // 将交换后的数组,组合成字符串 for ( var j = 0; j < iLen; j++ ) { sTmp += aTarget[j]; } return sTmp; // return aTarget; } console.log( dichotomy( "Hello world !" ) ); // reverse.html:37 ! dlrow olleH
经典阶乘
递归
function factorialize(num) { // "use strict"; if ( num === 0 || num === 1 ) return 1; // 严格模式下,已经不允许使用arguments.callee了 return num * arguments.callee( num - 1 ); } console.log( factorialize(5) ); // result: 120;
迭代实现,代替递归
function iterate ( num ) { if ( num <= 1 ) return 1; var iTmp = num; while ( num > 1) { iTmp *= --num; // num--; } return iTmp; } console.log( iterate(5) ); // 120
缓冲方式实现 TODO
回文(一),比较笨拙的方法,通过将字符串用split转成字符数组,然后将数组中的元素平分成左右两个数组,前面的数组用push,后面的用unshift方法存入,通过toString和toLowerCase方法比较两个数组,达到目的。后面会继续优化这个方法,且继续研究其他性能更好的方法;
function isPalindrome(str) { // Good luck! var sTarget = str.replace(/[^a-zA-Z0-9]/g, ""), // 过滤掉非数字和字母的字符 aLeft = [], // 存放左边的元素 aRight = [], // 存放右边的元素 aTarget = sTarget.split(""), // 将目标字符串转成数组 iLen = aTarget.length; for ( var i = 0; i < iLen; i++ ) { // 要转整,不然长度为奇数的时候会把中间的那个元素也保存起来了,下同 if ( i < parseInt( iLen / 2 ) ) { aLeft.push( aTarget[i] ); } else { if ( iLen % 2 !== 0 && i == parseInt(iLen / 2) ) continue; // 过滤奇数时中间的元素 aRight.unshift( aTarget[i] ); } } // 格式化,忽略大小写,比较 return aLeft.toString().toLowerCase() == aRight.toString().toLowerCase(); }