简体   繁体   English

如何在整数数组中查找整数的重复序列?

[英]How to find repeating sequence of Integers in an array of Integers?

How to find repeating sequence of Integers in an array of Integers? 如何在整数数组中查找整数的重复序列?

00 would be repeating, so would 123123, but 01234593623 would not be. 00将重复,123123也将重复,但01234593623将不会重复。

I have an idea to how to do this, but it is blurry in my mind, and my implementation doesn't go far due to this. 我对如何执行此操作有一个想法,但是我的想法很模糊,因此我的实现并没有走多远。

My idea was 我的主意是

  1. Offset by a certain amount each time going through a for loop 每次经过for循环都会偏移一定量
  2. Loop through inside of that and compare chunks of numbers by that offset 循环遍历内部,并通过该偏移量比较数字块

In Java, I got this far: 在Java中,我到此为止:

    String[] p1 = new String[nDigitGroup];
    String[] p2 = new String[nDigitGroup];

    for (int pos = 0; pos < number.length - 1; pos++)
    {
        System.out.println("HERE: " + pos + (nDigitGroup - 1));
        int arrayCounter = -1;

        for (int n = pos; n < pos + nDigitGroup ; n++)
        {
            System.out.printf("\nPOS: %d\nN: %d\n", pos, n);
            arrayCounter++;
            p1[arrayCounter] = number[n];

            System.out.println(p1[arrayCounter]);
        }

        pos += nDigitGroup;
        arrayCounter = -1;

        System.out.println("SWITCHING");

        for (int n = pos; n < pos + nDigitGroup ; n++)
        {
            System.out.printf("\nPOS: %d\nN: %d\n", pos, n);
            arrayCounter++;
            p2[arrayCounter] = number[n];

            System.out.println(p2[arrayCounter]);
        }

        if (p1[0].equals(p2[0]) && p1[1].equals(p2[1])) System.out.println("MATCHING");
    }

When ran with these arguments: 使用以下参数运行时:

        repeatingSeqOf(2, new String[] {"1", "2", "3", "4", "5", "6", "7", "7" });

I am correctly filling the section arrays, but it breaks on an index out of bounds exception. 我正确地填充了节数组,但是它在索引超出范围时中断。

@MiljenMikic answer's is great, especially since the grammar isn't actually regular. @MiljenMikic的答案很好,尤其是因为语法实际上不是常规的。 :D :D

If you want to do it on an array in general, or want to understand it, this does pretty much exactly what the regex does: 如果您想一般地在一个数组上做它,或者想了解它,那么它几乎可以完成正则表达式的工作:

public static void main(String[] args) {
    int[] arr = {0, 1, 2, 3, 2, 3}; // 2, 3 repeats at position 2.

    // for every position in the array:
    for (int startPos = 0; startPos < arr.length; startPos++) {
        // check if there is a repeating sequence here:

        // check every sequence length which is lower or equal to half the
        // remaining array length: (this is important, otherwise we'll go out of bounds)
        for (int sequenceLength = 1; sequenceLength <= (arr.length - startPos) / 2; sequenceLength++) {

            // check if the sequences of length sequenceLength which start
            // at startPos and (startPos + sequenceLength (the one
            // immediately following it)) are equal:
            boolean sequencesAreEqual = true;
            for (int i = 0; i < sequenceLength; i++) {
                if (arr[startPos + i] != arr[startPos + sequenceLength + i]) {
                    sequencesAreEqual = false;
                    break;
                }
            }
            if (sequencesAreEqual) {
                System.out.println("Found repeating sequence at pos " + startPos);
            }
        }
    }
}

You can always play with regular expressions to achieve a desired result. 您始终可以使用正则表达式来获得所需的结果。 Use the regex backreference and combine it with the greedy quantifier: 使用正则表达式反向引用 ,并将其与贪婪量词结合使用:

    void printRepeating(String arrayOfInt)
    {
        String regex = "(\\d+)\\1";
        Pattern patt = Pattern.compile(regex);
        Matcher matcher = patt.matcher(arrayOfInt);           
        while (matcher.find())                              
        {               
            System.out.println("Repeated substring: " + matcher.group(1));
        } 
    }          

The answer posted by @AdrianLeonhard is perfectly working. @AdrianLeonhard发布的答案非常有效。 But if I have a sequence of 0, 1, 2, 3, 4, 3, 5, 6, 4, 7, 8, 7, 8 many might be wondering on how to get all the repeated numbers from the array. 但是,如果我有一个0、1、2、3、4、3、5、6、4、7、8、7、8的序列,那么许多人可能想知道如何从数组中获取所有重复的数字。

So, I wrote this simple logic which prints all the repeated numbers with their positions 所以,我写了这个简单的逻辑,将所有重复的数字及其位置打印出来

    int[] arr = {0, 1, 2, 3, 4, 3, 5, 6, 4, 7, 8, 7, 8};

    for(int i=0; i<arr.length;i++){
        for(int j=i+1; j<arr.length;j++){
            if(arr[i] == arr[j]){
                System.out.println("Number: "+arr[i]+" found repeating at position: "+i+" , repeated at position "+j);
            }
        }
    }

Try this: 尝试这个:

string lookIn = "99123998877665544123"; 
// above has length of 20 (in positions 0 through 19)
int patternLength = 3;
// want to search each triple of letters 0-2, 1-3, 2-4 ... 17-19
//   however since there must be 3 chars after the 3-char pattern
//   we only want to search the triples up to 14-16 (20 - 3*2)
for (int i=0; i <= lookIn.Length - patternLength * 2; i++) {
   string lookingFor = lookIn.Substring(i, patternLength);
   // start looking at the pos after the pattern
   int iFoundPos = lookIn.IndexOf(lookingFor, i + patternLength);
   if (iFoundPos > -1) {
      string msg = "Found pattern '" + lookingFor 
                 + "' at position " + i 
                 + " recurs at position " + iFoundPos;
   }
}
// of course, you will want to validate that patternLength is less than
//   or equal to half the length of lookIn.Length, etc.

EDIT: improved and converted to javascript (from C# ... oops, sorry about that...) 编辑:改进并转换为javascript(从C#...哎呀,对此表示抱歉...)

function testfn() {
   var lookIn = "99123998877665544123"; 
   // above has length of 20 (in positions 0 through 19)
   var patternLength_Min = 2;
   var patternLength_Max = 5;
   if (patternLength_Max > (lookIn.length / 2) 
                || patternLength_Max < patternLength_Min
                || patternLength_Min < 1) {
      alert('Invalid lengths.')
   }
   var msg = "";
   for (var pLen = patternLength_Min; pLen <= patternLength_Max; pLen++)  {
      for (var i = 0; i <= lookIn.length - pLen * 2; i++) {
         var lookingFor = lookIn.substring(i, i + pLen);
         // start looking at the pos after the pattern
         var iFoundPos = lookIn.indexOf(lookingFor, i + pLen);
         if (iFoundPos > -1) {
            msg = msg + "Found '" + lookingFor 
                       + "' at pos=" + i 
                       + " recurs at pos=" + iFoundPos + "\n";
            ;
         }
      }
   }
   alert(msg);
}

The message box displays the following: 该消息框显示以下内容:

Found '99' at pos=0 recurs at pos=5
Found '12' at pos=2 recurs at pos=17
Found '23' at pos=3 recurs at pos=18
Found '123' at pos=2 recurs at pos=17

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM