2011-09-06 12 views
16

Tôi đang cố gắng tìm một cách dễ dàng để lặp (lặp) trên một mảng để tìm tất cả các số bị thiếu trong một chuỗi, mảng sẽ trông giống như một số bên dưới.Mảng - Tìm số bị thiếu trong một chuỗi

var numArray = [0189459, 0189460, 0189461, 0189463, 0189465];

Đối với các mảng trên, chúng tôi sẽ cần 01894620189464 đăng xuất.

Mọi suy nghĩ?

CẬP NHẬT

Thanks for the help,

Xin lỗi Kennebec có thể không nhận được chức năng của bạn để làm việc một cách chính xác cuối cùng. Xem nhận xét bên dưới câu trả lời của bạn.

EDIT: đây là giải pháp chính xác mà tôi đã sử dụng từ câu trả lời của 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] 
+0

Bạn có thể lặp qua mảng và so sánh từng hai yếu tố. –

Trả lời

21

Nếu bạn biết rằng những con số đều được sắp xếp và tăng:

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 
    } 
} 
+0

Cảm ơn Soufiane, là sẽ bắt mỗi lần xuất hiện trong mảng vì mảng sẽ chứa khoảng 100 con số và làm thế nào tôi sẽ đăng nhập số thực tế mà không có ở đó, một lần nữa tôi có thể được dày. –

+0

@Mark: Mỗi số giữa 'numArray [i]' và 'numArray [i-1]', nếu chênh lệch lớn hơn '1', không nằm trong mảng. –

+0

Có, bạn sẽ đi qua tất cả các mục trong mảng, và để nắm bắt số còn thiếu, khi sự khác biệt là X (X! = 1), số bị thiếu của bạn là: numArray [i-1] + j (j> 0 và j

0

Nó sẽ là khá đơn giản để sắp xếp các mảng:

numArray.sort(); 

Sau đó, tùy thuộc vào những gì là dễ dàng nhất cho bạn:

  1. Bạn có thể chỉ cần đi qua mảng, bắt các mẫu tuần tự và kiểm tra chúng khi bạn đi.
  2. Bạn có thể chia mảng thành nhiều mảng các số tuần tự và sau đó kiểm tra từng mảng riêng biệt đó.
  3. Bạn có thể giảm mảng đã sắp xếp thành một mảng các cặp trong đó mỗi cặp là chuỗi bắt đầu và kết thúc, sau đó so sánh các chuỗi bắt đầu/kết thúc đó với dữ liệu khác của bạn.
5

Xem zero hàng đầu của bạn, họ sẽ bị bỏ khi mảng là interpreted-

var A = [0.189.459, 0.189.460, 0.189.461, 0.189.463, 0.189.465]

(A trở lại [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 = [0.189.459, 0.189.460, 0.189.461, 0.189.463, 0.189.465]; alert (vắng mặt (A))

/* giá trị trả về: (Mảng) 189462,189464 */

+0

Tôi nhận được lỗi sau khi chạy hàm này - TypeError 1406: Biến indexOf không phải là một loại hàm. –

0

tôi sử dụng một hàm đệ quy cho việc này.

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; 
} 

Không phải là ý tưởng hay nhất nếu bạn đang xem qua một tập hợp số lượng lớn. CẢNH BÁO NHANH: các hàm đệ quy là tài nguyên chuyên sâu (con trỏ và nội dung) và điều này có thể cho bạn kết quả không mong muốn nếu bạn đang làm việc với số lượng lớn. Bạn có thể xem jsfiddle. Điều này cũng giả định rằng bạn đã sắp xếp mảng.

Về cơ bản, bạn chuyển hàm "findMissing()" mảng mà bạn muốn sử dụng, số bắt đầu và số dừng và để cho nó đi từ đó.

Vì vậy:

var missingArr = findMissing(sequenceArr, 1, 10); 
-1

Dưới đây là một biến thể của @ Mark Walters của function mà thêm khả năng xác định một ranh giới thấp hơn cho chuỗi của bạn, ví dụ nếu bạn biết rằng chuỗi của bạn nên luôn luôn bắt đầu tại 0189455, hoặc một số số khác như 1.

Cũng có thể điều chỉnh mã này để kiểm tra ranh giới phía trên, nhưng tại thời điểm này, nó chỉ có thể tìm đường biên dưới.

//Our first example array. 
 
var numArray = [0189459, 0189460, 0189461, 0189463, 0189465]; 
 
//For this array the lowerBoundary will be 0189455 
 
var numArrayLowerBoundary = 0189455; 
 

 
//Our second example array. 
 
var simpleArray = [3, 5, 6, 7, 8, 10, 11, 13]; 
 
//For this Array the lower boundary will be 1 
 
var simpleArrayLowerBoundary = 1; 
 

 
//Build a html string so we can show our results nicely in a div 
 
var html = "numArray = [0189459, 0189460, 0189461, 0189463, 0189465]<br>" 
 
html += "Its lowerBoundary is \"0189455\"<br>" 
 
html += "The following numbers are missing from the numArray:<br>" 
 
html += findMissingNumbers(numArray, numArrayLowerBoundary); 
 
html += "<br><br>" 
 
html += "simpleArray = [3, 5, 6, 7, 8, 10, 11, 13]<br>" 
 
html += "Its lowerBoundary is \"1\".<br>" 
 
html += "The following numbers are missing from the simpleArray:<br>" 
 
html += findMissingNumbers(simpleArray, simpleArrayLowerBoundary); 
 

 
//Display the results in a div 
 
document.getElementById("log").innerHTML=html; 
 

 
//This is the function used to find missing numbers! 
 
//Copy/paste this if you just want the function and don't need the demo code. 
 
function findMissingNumbers(arrSequence, lowerBoundary) { 
 
    var mia = []; 
 
    for (var i = 0; i < arrSequence.length; i++) { 
 
    if (i === 0) { 
 
     //If the first thing in the array isn't exactly 
 
     //equal to the lowerBoundary... 
 
     if (arrSequence[i] !== lowerBoundary) { 
 
     //Count up from lowerBoundary, incrementing 1 
 
     //each time, until we reach the 
 
     //value one less than the first thing in the array. 
 
     var x = arrSequence[i]; 
 
     var j = lowerBoundary; 
 
     while (j < x) { 
 
      mia.push(j); //Add each "missing" number to the array 
 
      j++; 
 
     } 
 
     } //end if 
 
    } else { 
 
     //If the difference between two array indexes is not 
 
     //exactly 1 there are one or more numbers missing from this sequence. 
 
     if (arrSequence[i] - arrSequence[i - 1] !== 1) { 
 
     //List the missing numbers by adding 1 to the value 
 
     //of the previous array index x times. 
 
     //x is the size of the "gap" i.e. the number of missing numbers 
 
     //in this sequence.  
 
     var x = arrSequence[i] - arrSequence[i - 1]; 
 
     var j = 1; 
 
     while (j < x) { 
 
      mia.push(arrSequence[i - 1] + j); //Add each "missing" num to the array 
 
      j++; 
 
     } 
 
     } //end if 
 
    } //end else 
 
    } //end for 
 
    //Returns any missing numbers, assuming that lowerBoundary is the 
 
    //intended first number in the sequence. 
 
    return mia; 
 
}
<div id="log"></div> <!-- Just used to display the demo code -->

1

Để tìm một số mất tích trong một chuỗi, Trước hết, chúng ta cần phải sắp xếp một mảng. Sau đó, chúng tôi có thể xác định số bị thiếu. Tôi đang cung cấp ở đây mã đầy đủ với một số kịch bản thử nghiệm. mã này sẽ chỉ xác định số tích cực bị thiếu, nếu bạn vượt qua các giá trị âm ngay cả khi nó cho số dương.

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]));

Các vấn đề liên quan