2016-03-27 17 views
-4

numaralı yinelenen 2 ila:Mesafe JavaScript ex kullanarak dizideki 2 yinelenen sayılar arasındaki mesafeyi hesaplamak anlamaya çalışıyorum bir dizi

["2","3","4","2"] => 3 (2 is a duplicate number) 
    ["1","4","5","5"] => 1 (5 is a duplicate number) 
    ["1","4","5","9","4"] => 3 (4 is a duplicate number) 
+0

garanti yalnızca bir yinelenen veya? 2 durum yapabiliyorsanız – Steve

+0

. Harika olurdu – tamnguyen

+0

Kendin vurdun mu? Yoksa sadece cevabı arıyorsun. Kendiniz denerken bazı kodlar gönderirseniz çok daha güzel. –

cevap

1

ikiden fazla oluşumlarını olmayacağını varsayarsak

  • size yardımcı olacak bir encountered diziye öğe ekleme, dizi öğeleri Traverse

    1. ve her öğenin tüm endeksler olsun -: senin dizideki herhangi bir değerin, aşağıdaki adımlar atabilirsiniz öğenin sahip olup olmadığını belirlemek için Zaten aradı,
    2. Öğe 2 tekrar içeriyorsa, dizinler arasındaki farkı öğrenin ve bu sizin adım sayısı olacaktır.

    Javascript'te, aşağıdaki kod sizin için aynısını yapacaktır.

    var temp = [2,3,4,2,5,4,1,3]; 
     
    var encountered = []; 
     
    
     
    //This function gets you all the indexes of `val` inside `arr` array. 
     
    function getAllIndexes(arr, val) { 
     
        var indexes = [], i; 
     
        for(i = 0; i < arr.length; i++) 
     
        if (arr[i] === val) 
     
         indexes.push(i); 
     
        return indexes; 
     
    } 
     
    
     
    for(var i=0;i<temp.length;i++) { 
     
        if(encountered[temp[i]]) continue; 
     
        else { 
     
         var indexes = getAllIndexes(temp, temp[i]); 
     
         encountered[temp[i]] = true; 
     
         if(indexes.length>1) { 
     
          var steps = indexes[1]-indexes[0]; 
     
          $('.container').append('Duplicate item: '+temp[i]+' steps: '+ steps+'<br/>'); 
     
         } 
     
        } 
     
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
     
    <div class="container"></div>
    burada

    Çalışma JSFiddle ->https://jsfiddle.net/dmnuwas5/

  • +0

    Bir çekicilik gibi çalışıyor, çok teşekkürler! – tamnguyen

    +0

    @tamnguyen Bir şey değil! Bu yardımcı olursa lütfen kabul edin. ;) –

    0

    Java kodu yinelenen öğeler arasındaki mesafeyi bulmak için. Birden fazla yinelenen öğe varsa, bu yinelenen öğe çiftleri arasındaki mesafelerin minimumunu döndürür. Ayrıca, yinelenen öğeleri iki kez (değil iki katından fazla) meydana geldiğini varsayar
    Zaman Karmaşıklık: O (n)
    Uzay Karmaşıklık: (n) O

    public int minDuplicateDistance(int[] arr) { 
        Map<Integer, Integer> dups = new HashMap<Integer, Integer>(); 
        int minDistance = Integer.MAX_VALUE; 
        for (int x = 0; x < arr.length; x++) { 
         if (dups.containsKey(arr[x])) { 
          int index = dups.get(arr[x]); 
          int distance = x - index; 
          minDistance = minDistance > distance ? distance : minDistance; 
         } else { 
          dups.put(arr[x], x); 
         } 
        } 
        return minDistance; 
    } 
    
    1

    Umarım bu sözde kod doğru yolda koyacağız: Bu, birden oluşum için bir öneri

    values = original array 
    distances = {} 
    firstIndex = {} 
    
    loop over values with index i { 
        item = values[i] 
        if firstIndex[item] >= 0 { // this is important because the first index could be 0 
        if item does not exist in distances object { // This would be different if you are going for max distance instead of min distance in the case of multiple of the same item 
         distances[item] = i - firstIndex[item] 
        } 
        } else { 
        firstIndex[item] = i 
        } 
    } 
    
    1

    aynı maddenin ve en az asgari bir mesafenin hesaplanması.

    function getDistance(array) { 
     
        var o = {}, r = {}; 
     
        array.forEach(function (a, i) { 
     
         o[a] = o[a] || []; 
     
         o[a].push(i); 
     
        }); 
     
        Object.keys(o).forEach(function (k) { 
     
         if (o[k].length > 1) { 
     
          r[k] = Math.min.apply(null, o[k].reduce(function (r, a, i, aa) { 
     
           i && r.push(a - aa[i - 1]); 
     
           return r; 
     
          }, [])); 
     
         } 
     
        }); 
     
        return r; 
     
    } 
     
    
     
    document.write('<pre>' + JSON.stringify(getDistance([2,3,4,2,5,4,1,3]), 0, 4) + '</pre>'); 
     
    document.write('<pre>' + JSON.stringify(getDistance(["2", "3", "4", "2", "3", "5", "6", "2"]), 0, 4) + '</pre>');

    1

    ihtiyaçlarınızı karşılayan bir minimum bir örnek. Anahtar olarak yinelenen sayıya ve değer olarak uzaklığa sahip bir nesne döndürür.

    function sift(arr) { 
        for (var i = 0, l = arr.length, out = {}; i < l; i++) { 
        var key = arr.shift(); 
        var index = arr.indexOf(key); 
        if (index > -1 && !out[key]) out[key] = index + 1; 
        } 
        return out; 
    } 
    
    sift(["2","3","4","2"]); // { 2: 3 } 
    sift(["1","4","5","5"]); // { 5: 1 } 
    sift(["1","4","5","9","4"]); // { 4: 3 } 
    sift(["2","3","4","2","3","5","6","2"]); // { 2: 3, 3: 3 } 
    sift(["6","2","3","4","2","3","5","6","2"]); // { 2: 3, 3: 3, 6: 7 } 
    

    DEMO

    İlgili konular