自己遇到的前端面试题解法
题目是这样的,我们的需求中可能会遇见数字大于javascript中对大的数,即javascript可以存储的极限,我们就会使用数组来存,比如1998,存储为[1,9,9,8].
我们需要一个方法,将这个数加一,写一个addOne函数实现,中间肯定不能出现再转换回原数.
面试的时候一般都比较紧张,所以就想出来用递归,就是遇见棘手的问题,索引值问题
先贴出,用面试官提出的for循环方法吧,当时没想出来,座地铁的时候想起来的
1 var arr = [9,9,9]; 2 3 function addOne (array) { 4 var len = arr.length; 5 for (var i=len-1; i>=0 ;i-- ) { 6 if ((arr[i] + 1) != 10){ 7 // 如果相加后小于10就退出for循环 8 break; 9 } else { 10 arr[i] = 0; 11 // 如果执行到了第一位相加后还为10,就得进1 12 if (i==0){ 13 arr.unshift(1); 14 } 15 } 16 } 17 return array; 18 } 19 20 alert(addOne(arr));
自己写的方法,有待完善。
var arr = [9,9,9]; var CreateAddOne = function (array) { var i = array.length -1; return function () { while(i >= 0){//这写的不大对,等会修改下 if ((array[i] += 1) == 10){ array[i] = 0; if (i-- == 0){ array.unshift(1); } // 执行递归,从后往前执行 arguments.callee(); } } return array; } } var addOne = CreateAddOne(arr); alert(addOne());
另一道面试题,关于正则的,去除连续的重复数字
1 var re = /(\d)\1+/g, 2 str = '1113332211', 3 res = ''; 4 5 res = str.replace(re, function (r1, r2) { 6 return r2; 7 }); 8 9 alert(res); // '1321'