前端面试的两道编程题目

	/*面试题:随机给出一串整数,取最长的连续数组,如[6,7,11,9,12,14,13,15] 得出[11,12,13,14,15]*/
	function maxContinueArray(input){
		if(!input&&input.length===0)return;
		var tempArray=[],maxArray=[],tempInt,nextInt,index,size,flag=false;
		var sort_array=input.sort(function(a,b){return a-b;});
		for(index=0,size=sort_array.length;index<size;index++){
			tempInt=Number(sort_array[index]);
			nextInt=Number(sort_array[index+1]);//数组溢出的时候返回NaN
			tempArray.push(tempInt);
			if(flag=(tempInt+1)===nextInt?false:true){
				if(Math.max(tempArray.length,maxArray.length)===tempArray.length){
						maxArray=tempArray.slice(0);		
				}
				tempArray=[];
			}	
		}
		return maxArray;
	}

 

	/*面试题:大整数相加,支持超出整数类型的长度,用数组表示*/
	function plus(input,input2){
		if(input===undefined||input.length===0)return;
		if(input2===undefined||input2.length===0)return;
	 	var str1=String(input),str2=String(input2),result='';
	 	 
	 	result=str1.length>str2.length?calcu(str1,str2):calcu(str2,str1);
	    function calcu(m,s){
	 		var a,b,c,d=0,ret=[],i=0,sSize=s.length;
	 		for(var index=m.length-1;index>=0;index--){
	 				++i;
	 			   a=m[index];
	 			   b=s[sSize-i]||0;
	 			   c=Number(a)+Number(b)+d;
	 			if(c<10){
	 				ret.push(c);
	 				d=0;	
	 			}else{
	 				ret.push((c-10));
	 			   d=1;
	 			}
	 		}
	 		return ret.reverse().join('');
	 	} 
	 	return result;
	}

 今天去面试了,结果题目做得一团遭, 两条编程题直接用笔写,还真是有难度, 写了1个钟,结果回家在firefox上测试,全部输出错误, 题目一加了一些多余的判断,导致了输出永远是第一个连续数组。

题目二, 压根就不用看,进位的时候,我都忘记去减10, 还有计算出来的结果忘记逆序输出, oh, my god, 学艺不精。

上网看了人家一篇大整数相加,一测试,跟我写的一样的不够健壮。

function add(a, b){
    var SPLITE_LENGTH = 3;
    var aL = String(a), bL = String(b);
    var resout = '', c = 0;
    while(aL != 0 || bL != 0){
        var aR = aL.slice(-SPLITE_LENGTH), bR = bL.slice(-SPLITE_LENGTH);
        var t = String(parseInt(aR) + parseInt(bR) + c);
        resout = t.slice(-SPLITE_LENGTH) + resout; // 字符拼接
        c = parseInt(t.slice(0, -SPLITE_LENGTH)||'0');
        aL = aL.slice(0, -SPLITE_LENGTH)||'0';
        bL = bL.slice(0, -SPLITE_LENGTH)||'0';
        console.log(resout, aL, bL, c);
    }
    if(c){
        resout = String(c) + resout;
    }
    return resout;
}

测试用例:

1.大正整数

plus(123151541512315150, 48154546104815460)

输出: "171306087617130610"

add(123151541512315150, 48154546104815460)

输出: "171306087617130610"

2.负数
plus(-123151541512315150, 48154546104815460)
输出: "NaN171306087617130610"
add(-123151541512315150, 48154546104815460)
输出:"NaN171306087617130610"
3.输出小数:
plus(-12315154151231.5150, 48154546104815460)
输出:"NaN17130608761713NaN976"
add(-12315154151231.5150, 48154546104815460);
输出:"NaN171306087616846976":
边界考虑完全不足,哎,要参考一下bigNumber.js这个开源项目是怎么实现的,那个才是正真的实现大数据相加。在代码里面应该体现出负数和小数处理的分支
 

你可能感兴趣的:(JavaScript,面试)