<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>