How to find repeating sequence of Integers in an array of Integers?

后端 未结 4 1227
清酒与你
清酒与你 2021-01-07 14:52

How to find repeating sequence of Integers in an array of Integers?

00 would be repeating, so would 123123, but 01234593623 would not be.

I have an idea to h

相关标签:
4条回答
  • 2021-01-07 15:07

    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...)

    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
    
    0 讨论(0)
  • 2021-01-07 15:10

    The answer posted by @AdrianLeonhard is perfectly working. 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.

    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);
                }
            }
        }
    
    0 讨论(0)
  • 2021-01-07 15:22

    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));
            } 
        }          
    
    0 讨论(0)
  • 2021-01-07 15:26

    @MiljenMikic answer's is great, especially since the grammar isn't actually regular. :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);
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题