私は配列をループする(反復する)簡単な方法を見つけて、シーケンス内のすべての不足している数値を見つけようとしています。配列は次のようになります。
var numArray = [0189459, 0189460, 0189461, 0189463, 0189465];
上記の配列の場合、0189462
および0189464
ログアウトしました。
[〜#〜] update [〜#〜]:これは、私がSoufianeの回答から使用した正確なソリューションです。
var numArray = [0189459, 0189460, 0189461, 0189463, 0189465];
var mia= [];
for(var i = 1; i < numArray.length; i++)
{
if(numArray[i] - numArray[i-1] != 1)
{
var x = numArray[i] - numArray[i-1];
var j = 1;
while (j<x)
{
mia.Push(numArray[i-1]+j);
j++;
}
}
}
alert(mia) // returns [0189462, 0189464]
[〜#〜]更新[〜#〜]
これは.reduceを使用したより良いバージョンです
var numArray = [0189459, 0189460, 0189461, 0189463, 0189466];
var mia = numArray.reduce(function(acc, cur, ind, arr) {
var diff = cur - arr[ind-1];
if (diff > 1) {
var i = 1;
while (i < diff) {
acc.Push(arr[ind-1]+i);
i++;
}
}
return acc;
}, []);
console.log(mia);
数値が並べ替えられて増加していることがわかっている場合:
for(var i = 1; i < numArray.length; i++) {
if(numArray[i] - numArray[i-1] != 1) {
//Not consecutive sequence, here you can break or do whatever you want
}
}
ES6スタイル
var arr = [0189459, 0189460, 0189461, 0189463, 0189465];
var [min,max] = [Math.min(...arr), Math.max(...arr)];
var out = Array.from(Array(max-min),(v,i)=>i+min).filter(i=>!arr.includes(i));
結果:[189462、189464]
先行ゼロに注意してください。配列が解釈されると削除されます
var A = [0189459、0189460、0189461、0189463、0189465]
(Aは[189459,189460,189461,189463,189465]を返します)
function absent(arr){
var mia= [], min= Math.min.apply('',arr), max= Math.max.apply('',arr);
while(min<max){
if(arr.indexOf(++min)== -1) mia.Push(min);
}
return mia;
}
var A = [0189459、0189460、0189461、0189463、0189465]; alert(absent(A))
/ *戻り値:(配列)189462,189464 * /
シーケンスで欠落している数を見つけるには、まず、配列をソートする必要があります。次に、不足している番号を特定できます。ここでは、いくつかのテストシナリオを含む完全なコードを提供しています。このコードは、欠落している正の数のみを識別します。負の値を渡しても、正の数が得られます。
function findMissingNumber(inputAr) {
// Sort array
sortArray(inputAr);
// finding missing number here
var result = 0;
if (inputAr[0] > 1 || inputAr[inputAr.length - 1] < 1) {
result = 1;
} else {
for (var i = 0; i < inputAr.length; i++) {
if ((inputAr[i + 1] - inputAr[i]) > 1) {
result = inputAr[i] + 1;
}
}
}
if (!result) {
result = inputAr[inputAr.length - 1] + 1;
}
return result;
}
function sortArray(inputAr) {
var temp;
for (var i = 0; i < inputAr.length; i++) {
for (var j = i + 1; j < inputAr.length; j++) {
if (inputAr[j] < inputAr[i]) {
temp = inputAr[j];
inputAr[j] = inputAr[i];
inputAr[i] = temp;
}
}
}
}
console.log(findMissingNumber([1, 3, 6, 4, 1, 2]));
console.log(findMissingNumber([1, 2, 3]));
console.log(findMissingNumber([85]));
console.log(findMissingNumber([86, 85]));
console.log(findMissingNumber([0, 1000]));
const findMissing = (numarr) => {
for(let i = 1; i <= numarr.length; i++) {
if(i - numarr[i-1] !== 0) {
console.log('found it', i)
break;
} else if(i === numarr.length) console.log('found it', numarr.length + 1)
}
};
console.log(findMissing([1,2,3,4,5,6,7,8,9,10,11,12,13,14]))
const findMissing = (arr) => {
const min = Math.min(...arr);
const max = Math.max(...arr);
// add missing numbers in the array
let newArr = Array.from(Array(max-min), (v, i) => {
return i + min
});
// compare the full array with the old missing array
let filter = newArr.filter(i => {
return !arr.includes(i)
})
return filter;
};
重複がないと仮定
let numberArray = [];
for (let i = 1; i <= 100; i++) {
numberArray.Push(i);
}
let deletedArray = numberArray.splice(30, 1);
let sortedArray = numberArray.sort((a, b) => a - b);
let array = sortedArray;
function findMissingNumber(arr, sizeOfArray) {
total = (sizeOfArray * (sizeOfArray + 1)) / 2;
console.log(total);
for (i = 0; i < arr.length; i++) {
total -= arr[i];
}
return total;
}
console.log(findMissingNumber(array, 100));
function missingNum(nums){
const numberArray = nums.sort((num1, num2)=>{
return num1 - num2;
});
for (let i=0; i < numberArray.length; i++){
if(i !== numberArray[i]){
return i;
}
}
}
console.log(missingNum([0,3,5,8,4,6,1,9,7]))
配列をソートするのはかなり簡単です。
numArray.sort();
次に、あなたにとって最も簡単だったものに応じて:
これには再帰関数を使用します。
function findMissing(arr, start, stop) {
var current = start,
next = stop,
collector = new Array();
function parseMissing(a, key) {
if(key+1 == a.length) return;
current = a[key];
next = a[key + 1];
if(next - current !== 1) {
collector.Push(current + 1);
// insert current+1 at key+1
a = a.slice( 0, key+1 ).concat( current+1 ).concat( a.slice( key +1 ) );
return parseMissing(a, key+1);
}
return parseMissing(a, key+1);
}
parseMissing(arr, 0);
return collector;
}
膨大な数のセットを調べている場合は、最善の方法とは言えません。公平な警告:再帰関数はリソースを大量に消費するため(ポインターなど)、膨大な数を扱う場合、予期しない結果が生じる可能性があります。 jsfiddle が表示されます。これは、配列がソートされていることも前提としています。
基本的に、「findMissing()」関数に使用する配列、開始番号と停止番号を渡して、そこから先に進みます。
そう:
var missingArr = findMissing(sequenceArr, 1, 10);
以下のコードを確認してください.....
function solution(A) {
var max = Math.max.apply(Math, A);
if(A.indexOf(1)<0) return 1;
var t = (max*(max+1)/2) - A.reduce(function(a,b){return a+b});
return t>0?t:max+1;
}