70 lines
1.3 KiB
JavaScript
70 lines
1.3 KiB
JavaScript
// LintCode 681. 缺失的第一个素数 https://www.lintcode.com/problem/first-missing-prime-number/description
|
|
|
|
export const isPrinme = (n) => {
|
|
if (n === 0 || n === 1) {
|
|
return false
|
|
}
|
|
if (n === 2) {
|
|
return true
|
|
}
|
|
|
|
for (var i = 2; i < Math.sqrt(n) + 1; i++) {
|
|
if (n % i === 0) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
export default (arr) => {
|
|
const nextPrimeNumber = (num, max) => {
|
|
if (isPrinme(num)) {
|
|
return num
|
|
}
|
|
do {
|
|
if (!max || num + 1 < max) {
|
|
num++
|
|
} else {
|
|
return false
|
|
}
|
|
} while (!isPrinme(num))
|
|
return num
|
|
}
|
|
|
|
arr = arr.filter(item => item > 0)
|
|
|
|
if (arr.length) {
|
|
const len = arr.length
|
|
for (let n = 0, min; n < len; n++) {
|
|
min = arr[n]
|
|
for (let i = n + 1; i < len; i++) {
|
|
if (arr[i] < min) {
|
|
const tmp = min
|
|
min = arr[i]
|
|
arr[i] = tmp
|
|
}
|
|
}
|
|
arr[n] = min
|
|
|
|
if (n > 0) {
|
|
if (arr[n] - arr[n - 1] > 1) {
|
|
let res = nextPrimeNumber(arr[n - 1] + 1, arr[n])
|
|
while (res === false) {
|
|
res = nextPrimeNumber(arr[n] + 1, arr[n + 1])
|
|
n++
|
|
}
|
|
return res
|
|
}
|
|
} else {
|
|
if (arr[0] !== 2) {
|
|
return 2
|
|
}
|
|
}
|
|
}
|
|
|
|
return nextPrimeNumber(arr.pop() + 1)
|
|
}
|
|
|
|
return 2
|
|
}
|