比如说这个:
dhoaisdjopascmj;lascnjvoaidhfsvo;ascdj;asj
代码实现如下:
function mostTimesChar (string) {
let map = {}, res = 0;
for(let i = 0; i < string.length; i ++) {
map[string[i]] = typeof map[string[i]] === 'undefined' ? 1 : map[string[i]] + 1;
}
for(let i in map) {
res = res > map[i] ? res : map[i];
}
return [map, res];
}
console.log(mostTimesChar("dhoaisdjopascmj;lascnjvoaidhfsvo;ascdj;asj"));
基本的思路是这样:遍历这个字符串,并将每一个字符存入一个对象中,对象中已有该字符则值+1,没有则为1,此时时间复杂度为O(n),再遍历这个对象,由于该对象的key是字符,value是个数,这样将对象中的value一一比对大小,即可输出最大的数。O(n) + O(n)的时间复杂度在n趋于无穷时仍为O(n)。
2、有两个数组arr0和arr1,里面的值均为number,求这两个数组的中位数。let arr0 = [1,2,3,4,5,6,7,8,9,10,11,12,13],
arr1 = [12,14,16,18];
解答如下:
const dorseyHandle = (arr0, arr1) => {
let arr = arr0.concat(arr1);
arr.sort((a,b) => a - b);
let center = Math.floor(arr.length / 2);
return arr.length % 2 ? arr[center] : (arr[center - 1] + arr[center]) / 2;
}
dorseyHandle(arr0, arr1);
这种方式比较粗暴的把两个数组进行合并,再排序,取中间值。虽直观但效率会较低。
3、 实现一个类型判断函数,如[1,2]返回array,'123’返回string,123返回number实现如下:
const getType = obj => {
//还记得上篇提到的正则么?
return Object.prototype.toString.call(obj).match(/(?<=s).*?(?=])/g)[0].toLowerCase();
}
4、判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母、数字、下划线,总长度为5-20
还是一串正则搞定。
const strRule = str => /^[a~zA~Z]{1}[w]{4, 19}$/.test(str);
console.log(strRule("21djpoasdjxpoas"));
5、数据处理,假设现在需要对以下JSON数据按时间进行排序,你会怎么做。
let data = [
{
time: "2019-03-18 23:44:32",
detail: "公安部破获一起重大事件..."
},
{
time: "2019-02-18 17:44:12",
detail: "公安部破获一起重大事件..."
},
{
time: "2018-07-21 20:44:08",
detail: "公安部破获一起重大事件..."
},
{
time: "2019-03-18 22:14:32",
detail: "公安部破获一起重大事件..."
},
{
time: "2019-02-11 10:54:32",
detail: "公安部破获一起重大事件..."
},
{
time: "2018-02-09 09:44:32",
detail: "公安部破获一起重大事件..."
}
]
实现的代码如下:
const dataRank = data => {
let times = [],
median = {};
data.map(item => {
let time = new Date(item.time).getTime();
times.push(time);
median[time] = item;
});
times.sort((a, b) => b - a);
return times.map(item => {
return median[item];
})
}
其实这个是用map将时间映射成时间戳,排序后再重新映射回去。较传统for循环遍历较简单一些。



