例如
var arr = [0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 7, 0, 9]
var arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
var arr = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
应该输出:
3
12
4
例如
var arr = [0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 7, 0, 9]
var arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
var arr = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
应该输出:
3
12
4
@12345678 利用了 JS 对象 key 是数字时有序这个特性,👍
我来写个利用 Set 去重再排序的写法(Set 不会按数字序排)
function find(arr) {
return arr.indexOf([...new Set(arr)].sort((a, b) => a - b)[1]);
}
再来个中规中矩的写法
function find(arr) {
// 保存最小的两个 index,初始化就是 0
let mins = [0, 0];
for (let i = 1; i < arr.length; i++) {
// 如果当前数值跟 mins 中的任意一个相同,那直接忽略掉
if (arr[i] === arr[mins[0]] || arr[i] === arr[mins[1]]) {
continue;
}
// 如果当前数值小于最小的那个,即 arr[mins[0]],
// 那 mins[0] 替换为当前 index,原来的值顺移到 mins[1]
if (arr[i] < arr[mins[0]]) {
([mins[1], mins[0]] = [mins[0], i]);
}
// 否则,如果 mins 中的两个值相同,直接替换掉 mins[1],此时 mins[1] 指向的不是当前最小就是当前第二小
// 如果不同,但当前值小于 mins[1] 对应的值,也替换掉 mins[1],此时 min[1] 指向的是当前第二小
else if (arr[mins[0]] == arr[mins[1]] || arr[i] < arr[mins[1]]) {
mins[1] = i;
}
}
return mins[1];
}
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决