前些天有網友發來一些前端面試的題目,雖然說不是很難,但卻是我們開發過程中經常碰到的問題,而且有些公司也喜歡面試這類的題目來考察面試者的能力,所以我覺得有必要收集一下有關這些的題目。
題目一:找出字符串中出現次數最多的那一個字符?
要解答這道題其實很簡單,但怎么答得好才是關鍵,你寫出的方法性能好才能得高分
1 // 方法一(推薦) 2 // 用到了正則,然后剔除了已計算過的字符,減少了循環的次數,所以性能是比較好的 3 function getMostChar1(str){ 4 var mostChar = [], 5 maxLen = 0, 6 oldStr, char, reChar, charLen; 7 8 while(str !== ''){ 9 oldStr = str; 10 char = str.charAt(0); 11 reChar = char; 12 13 // 如果是正則特殊字符,則轉義 14 if(/[\$\(\)\*\+\.\?]/.test(reChar)) reChar = '\\' + reChar; 15 str = str.replace(new RegExp(reChar, 'g'), ''); 16 17 charLen = oldStr.length - str.length; 18 if(charLen > maxLen){ 19 mostChar = [char]; 20 maxLen = oldStr.length - str.length; 21 }else if(charLen === maxLen){ 22 mostChar.push(char); 23 } 24 } 25 return {'mostChar': mostChar.join(), 'maxLen': maxLen}; 26 } 27 28 // 方法2 29 // 1、轉換成鍵值格式數據 eg.'程序員程序員' -> {'程': 2, '序': 2, '員': 2} 30 // 2、再轉換成數組格式 eg.{'程': 2, '序': 2, '員': 2} ->[2]:['程', '序', '員']。 31 function getMostChar2(str) { 32 var strArr = str.split(''), 33 obj = {}, 34 arr = [], 35 len = strArr.length, i, key; 36 37 for(i = 0; i < len; i++){ 38 obj[strArr[i]] ? obj[strArr[i]]++ : obj[strArr[i]] = 1; //記錄數目 39 } 40 41 for(key in obj){ 42 arr[obj[key]] ? arr[obj[key]].push(key) : arr[obj[key]] = [key]; //取出 43 } 44 45 return {'mostChar': arr[arr.length - 1].join(), 'maxLen': arr.length - 1}; 46 47 } 48 49 // 方法3 50 // 代碼最少,充分利用數組的sort方法根據出現頻繁排序。 51 function getMostChar3(str){ 52 var most = str.split('').sort().join('').match(/(.)\1*/g); //排列重復字符 53 most = most.sort(function(a,b){ 54 return a.length - b.length 55 }) 56 .pop();//按出現頻繁排序 57 return {'mostChar': most.charAt(0), 'maxLen': most.length}; 58 }
題目二:請寫一個將字符串轉成駝峰的方法?例如:border-bottom-color -> borderBottomColor
1 function camelCase(str){ 2 return str && str.replace(/-([a-z]|[0-9])/ig, function(all, $1){ 3 return ($1 + '').toUpperCase(); 4 }); 5 }
題目三:寫一個方法,為元素添加class?
// 使用方式:addClass(oDiv,'b');
// 使用前:<div class="a"></div>
// 使用后:<div class="a b"></div>
// 如果該元素內已有一個class名為“b”,就不能重復添加
1 function addClass(elem, className){ 2 if(!elem) return; 3 var reClass = new RegExp('\\b' + className + '\\b'); 4 !reClass.test(elem.className) && (elem.className += ' ' + className); 5 }
題目四:寫一個方法,把字符串反轉,例如reverse(str)
// var str='我愛你';
// alert(reverse(str));
// 彈出結果:'你愛我';
巧妙地運用了數組的reverse方法,所以高效
1 if(!String.prototype.reverse){ 2 String.prototype.reverse = function(){ 3 return this.split('').reverse().join(''); 4 }; 5 }
題目五:為數組寫一個獲取索引方法:indexOf()
1 if(!Array.prototype.indexOf){ 2 Array.prototype.indexOf = function(value){ 3 for(var i=0, len=this.length, item; i<len; i++){ 4 item = this[i]; 5 if(item === value){ 6 return i; 7 } 8 } 9 return -1; 10 } 11 }
題目六:為數組寫一個檢測是否包含值方法:contains()
1 if(!Array.prototype.contains){ 2 Array.prototype.contains = function(value){ 3 for(var i=0, len=this.length, item; i<len; i++){ 4 item = this[i]; 5 if(item === value){ 6 return true; 7 } 8 } 9 return false; 10 } 11 }
題目七:為數組寫一個去重方法:unique()
if(!Array.prototype.unique){ Array.prototype.unique = function(value){ var newArr = [], done = {}; for(var i=0, len=this.length, item; i<len; i++){ item = this[i]; if(!done[item]){ newArr.push(item); done[item] = true; } } return newArr; } }
題目八:寫一個方法region(),獲取數字的區間
// 示例1:alert(region(3,6));
// 彈出結果:4,5
// 示例2:alert(region(9,5));
// 彈出結果:8,7,6
1 function region(num1, num2){ 2 var min = Math.min(num1, num2), 3 max = Math.max(num1, num2), 4 ret = []; 5 for(++min; min < max; ){ 6 ret.push(min++); 7 } 8 if(num1 > num2) return ret.reverse().join(); 9 10 return ret.join(); 11 }
題目九:請將數組的日期從前到后排序
// var myDate=['2012-4-19','2012-4-29','2012-4-2','2012-4-5'];
// 輸出:['2012-4-2','2012-4-5','2012-4-19','2012-4-29']
1 function sortDate(arr){ 2 return arr.sort(function(date1, date2){ 3 // 統一轉換成 yyyy/MM/dd 的格式,兼容IE,否則new Date返回NaN 4 date1 = date1.replace('-', '/'); 5 date2 = date2.replace('-', '/'); 6 return new Date(date1).getTime() - new Date(date2).getTime(); 7 }); 8 }
題目十:寫一個getStyle()函數,獲取div的邊框粗細,並兼容所有瀏覽器
// #div1{ width:100px; height:100px; border:5px solid red;}
// getStyle(div1, 'border-top-width');
1 function getStyle(elem, cssArr){ 2 if(elem && elem.nodeType){ 3 // border-top -> borderTop 4 cssArr = typeof cssArr === 'string' ? camelCase(cssArr) : ''; 5 6 // 優先獲取 7 if(elem.style[cssArr]) return elem.style[cssArr]; 8 // for IE 9 else if(elem.currentStyle) return elem.currentStyle[cssArr]; 10 // for w3c 11 else if(document.defaultView && document.defaultView.getComputedStyle){ 12 // borderTop -> border-top 13 cssArr = cssArr.replace(/([A-Z])/g, '-$1').toLowerCase(); 14 15 var style = document.defaultView.getComputedStyle(elem, ''); 16 return style && style.getPropertyValue(cssArr); 17 } 18 } 19 return null; 20 }
題目十一:寫一個為字符串加密解密的方法:textEncode(),textDecode()
// var str='無賴君子';
// alert(textEncode(str));
// 執行結果: "62740-106526-52033-55520"
1 function textEncode(text){ 2 var encodeArr = []; 3 for(var i=0, len=text.length; i<len; i++){ 4 encodeArr.push(text.charCodeAt(i).toString(8)); 5 } 6 return encodeArr.join('-'); 7 } 8 9 function textDecode(text){ 10 var encodeArr = text.split('-'), 11 decodeArr = []; 12 for(var i=0, len=encodeArr.length; i<len; i++){ 13 decodeArr.push(String.fromCharCode(parseInt(encodeArr[i], 8))); 14 } 15 return decodeArr.join(''); 16 }
暫時就收集這些,長期更新。而且以上的答案也不一定是最好的,如果讀者們有更好的答案,希望能留言。
歡迎加入web前端交流群(75701468) 分享您我的經驗,相互交流,共享資源,不怕競爭,才會學習得更快。