1.js面试题
<script> /** * 面试题一:获取数组中不同项相同的字符,且长度相同长度最大的,如下最大的是hello * 思路: * 1.先找到数组中最短的项,用此来做相关判断,可以减少循环 * 2.再不断的分割最小的项循环寻找,找到的放到对象中,如hello,分割为h,he,hel,hell,hello;e,el,ell,ello等依次往下找 * 3.再循环对象找到length最大的项 */ const arr = [ 'ajddghello', 'acchello', 'eehelly' ]; console.log(findMinLen(arr)); function findMinLen(arr) { let tem = ''; let minLen = 0; for(let i = 0; i<arr.length; i++) { let len = arr[i].length; if(i==0) {minLen = len;} if(len < minLen) { minLen = len; tem = arr[i]; } } return getBigCommon(tem, arr); } function getBigCommon(str, arr) { let hash = {}; for(let i = 0; i<arr.length; i++) { for(let j = 1; j<=str.length; j++) { let item = str.slice(i, j); if(fnCircular(item, arr) && !hash[item]) { hash[item] = item; } } } let len = 0; var maxRepeat = ''; for(let attr in hash) { let valLen = hash[attr].length; if(valLen >= len) { len = valLen; maxRepeat = hash[attr]; } } return maxRepeat; } function fnCircular(attr, arr) { let re = new RegExp(attr, 'i'); let onOff = true; for(let i = 0; i<arr.length; i++) { if(!re.test(arr[i])) { onOff = false; break; } } return onOff; } /** * 面试题二:找到n个数组中的相同元素,如下找到def,循环次数最少 * 思路: * 1.先把数组的每项进行去重 * 2.再分别去循环没一项,放入到json中,属性值为该数组项,如果json中没有此项就让json对应的值等于1,如果已有此项则+1 * 3.最后再循环得到的json,遍历每项,如果有等于n的,则返回此项的属性 */ const arr2 = [ 'abdcd', 'def', 'dgh', 'def' ]; const arr3 = [ 'aa', 'sdd', 'def' ]; const arr4 = [ 'a', 'sd', 'def' ] console.log(findCommonItem(arr2, arr3, arr4)); function doRepeat(array){ var temArr = []; for(let i = 0; i < array.length; i++){ if (temArr.indexOf(array[i]) == -1) temArr.push(array[i]); } return temArr; } function findCommonItem(...arg) { var hash = {}; var len = arg.length; for(let i=0; i<len; i++) { let temArr = doRepeat(arg[i]); for(let attr in temArr) { let tem = temArr[attr]; if(hash[tem]) { hash[tem] ++; }else { hash[tem] = 1; } } } //如果想要处理多个,可以放到一个json里,此处就不做处理 for(let attr in hash) { if(hash[attr] === len) { return attr; } } return false; } </script>