EdwardZZZ / articles

工作点滴记录
2 stars 0 forks source link

面试题解答 #14

Open EdwardZZZ opened 7 years ago

EdwardZZZ commented 7 years ago

1、题目描述

给定一个递增序列,a1 <a2 <…<an 。定义这个序列的最大间隔为d=max{ai+1 – ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?

输入描述:

第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列。

输出描述:

输出答案。 输入例子:

1 2 3 7 8

输出例子:

4
// ES5
arr.forEach((n, i) => {
    result = Math.max(result, arr[i] - arr[i-1] || 0)
})

result = arr.reduce((prev, curr, i, _arr) => Math.max(prev, curr - arr[i-1] || prev), 0);

// ES6
result = Math.max(...arr.map((n, i) => arr[i] - arr[i-1] || 0));

2、题目描述

春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。 给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。 若没有金额超过总数的一半,返回0。

测试样例:

[1,2,3,2,2]

返回:

2
// ES5
const newArr = {};
arr.forEach((n) => {
    newArr[n] = newArr[n] ? newArr[n] + 1 : 1;
});

// ES6
// Math.max(...Object.keys(newArr).map((n) => newArr[n]));
Math.max(...Object.values(newArr));

3、题目描述

输入一个字符串,求出该字符串包含的字符集合

输入描述:

每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。

输出描述:

每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。

输入例子:

abcqweracb

输出例子:

abcqwer
const str = 'abcqweracb';
// ES6
[...new Set(str.split(''))].join('')

// ES5
str.split('').filter((s, i) => str.indexOf(s) === i).join('')

// Regexp
str.replace(/./g, ($1, $2, $3) =>  $3.indexOf($1) === $2 ? $1 : '')
// 倒序
str.replace(/(.)(?=.*\1)/g, '')