csdn是疯了吗,右下角的广告是一个人站在猪屁股后面打它。。。看了一下居然是baidu算出来的广告嵌在了iframe里,fixed to viewport,真是够了。最近还频频出现的广告是一个光头男子双手抱头痛苦状趴在桌子上,上面写着”前端薪资多少“,好了,我已经看到未来的下场了:一个掉秃了毛的穷光蛋。
c++写算法比起其他语言来感觉还是有优势的,在STL的基础上,同样的一道算法题,往往实现起来C++的代码最短。但是!自从开始搞前端,很久没用了。。看还是没问题的,写的时候就有恍如隔世的感觉。。。说到底还是学艺不精啊。。。。
感觉js的“人造性”更强,比如数组和字符串都有很多自带的function,而且有一种不拘于数据类型的灵活性(严格说,也不知道是好坏,可能比较省事吧)。写算法的话,网上的提交工具许多是用node 中readline 输入输出(readline简单使用可参考http://www.jb51.net/article/100229.htm),不过需要自己解析下输入,这里正则的知识最好了解一点,然后输出在回调函数中console.log就可以了。
网上的算法题,普遍以c++,java 实现的多,其他语言少,js就更少了,之前看了一本巴西谁写的js数据结构与算法,也很简单。不过语言只是个壳子,道理是一样的。准备连载一些用 js实现的常见算法,我是个渣渣,代码基本都跑过,但可能有些冗余啊什么的,调试的时候忘了删掉。总之仅供参考。
第一篇,动态规划之最长公共子序列。原理参考这篇吧。dp[i][j]保存了LST的长度,lst保存了每一个增长中的子序列,当lst.length==dp[lena][lenb]时,为最长子序列之一,将其输出。
function lstd(stra,strb){
var n,i,j;
var dp=[],lst=[];
var max=function(a,b){return (a>b?a:b);};
var arr=stra.split("");
var brr=strb.split("");
var lena=arr.length;
var lenb=brr.length;
// core
for(i=0;i<lena+1;i++){
dp[i]=[];
for(j=0;j<lenb+1;j++){
if(i==0||j==0) dp[i][j]=0;
else if(arr[i]===brr[j]){dp[i][j]=dp[i-1][j-1]+1;}
else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}
}
}
var lst="";
var traceback=function(i,j,lst){
while(i>0&&j>0){
if(arr[i-1]===brr[j-1]){
lst+=arr[i-1];
if(lst.length===dp[lena][lenb]){
console.log(lst.split("").reverse().join(""));}//输出,这里用了数组的reverse和join方法
i--;j--;
}
else{
if(dp[i-1][j]>dp[i][j-1])
{--i;}
else if(dp[i-1][j]<dp[i][j-1])
{--j;}
else{
traceback(i-1,j,lst);
traceback(i,j-1,lst);
return; //千万不要忘了return!!!
}
}
}
};
traceback(lena,lenb,lst);
return dp[lena][lenb]; //公共子序列的最大长度
}
x="ABCBDAB";y="BDCABA";
lstd(x,y);
在谷歌上跑的,结果是:
BCBA
BCAB
BDAB
4
明天有个实习的面试,希望能过,但是感觉自己啥都不会,哎。。。。
更新:面试果然挂掉了