जावा यह पता लगाने के लिए कि एक सरणी दूसरे का सबसेट है या नहीं

Nov 24 2020

इम को यह पता लगाने में परेशानी हो रही है कि क्या एक विशिष्ट संख्या दूसरे सरणी में है। पहला सरणी 10 यादृच्छिक संख्या उत्पन्न करता है और दूसरे सरणी में उपयोगकर्ता 5 संख्याओं का अनुमान लगाता है। यदि उपयोगकर्ता किसी क्रम का अनुमान लगाता है तो मैं यह पता लगाने की कोशिश कर रहा हूं। यह पता लगाने के लिए कि क्या उपयोगकर्ता इनपुट की संख्या 10 की सरणी में 1-5 से किसी भी संख्या में है, अगर नहीं तो यह संख्या 2-6 और इसी तरह की जाँच करेगा। उदाहरण के लिए, यदि कार्यक्रम में निम्नलिखित जीतने वाली संख्याएँ थीं: 23 56 67 06 43 22 59 24 90 66 और उपयोगकर्ता दर्ज किया गया: 01 06 43 22 89. मैं सूचकांक को सीमा से बाहर रखता हूँ। मैं इसे कैसे ठीक करूँ?

    // to check if user guessed a sequence
    
    boolean guessed = false;
    int counter = 0;
    int i , j = 0;
    
    for (i = 4; i < numbers.length; i++) {    // users numbers
        
        for ( j = 4; j < lottery.length; j++) {  // first 5 numbers from array 
            
            if ( lottery[i] == numbers[j]) {
                break;
            }
            if ( j == i) {
                guessed = true;
            }
        }
    }

जवाब

1 AlexRudenko Nov 24 2020 at 20:50

ऐसा लगता है कि String::indexOfइस कार्य के समान एक विधि को इस कार्य में लागू किया जाना चाहिए, जो एक सबर्रे के सूचकांक को खोजने की कोशिश कर रहा है int indexOf(int[] search, int[] input)

इसके अलावा, यह देखने के लिए आवश्यकता हो सकती है सभी संभव subarrays के searchsubarray ( lottery)। इस प्रकार, searchतर्क की एक व्यवस्था देखने के लिए उल्लिखित विधि को बढ़ाया जाना चाहिए :int indexOf(int[] search, int[] input)

सीधा कार्यान्वयन होगा:

static int indexOf(int search[], int from, int to, int[] input) {
    if (null == search || null == input || search.length > input.length) {
        return -1;
    }
    
    for (int i = 0, n = input.length - (to - from); i <= n; i++) {
        boolean found = true;
        for (int j = from; found && j < to; j++) {
            if (input[i + j - from] != search[j]) {
                found = false;
            }
        }
        if (found) {
            return i;
        }
    }
    return -1;
}

चौड़ाई और उचित अनुक्रमित from/ toखोज subranges की (की पूरी लंबाई से इस प्रकार उत्पन्न किया जा सकता lotteryकरने के लिए 2):

int[] numbers = {23, 56, 67, 06, 43, 22, 59, 24, 90, 66};
int[] lottery = {01, 06, 43, 22, 89};

for (int n = lottery.length; n > 1; n--) {
    for (int m = 0; m <= lottery.length - n; m++) {
        int ix = indexOf(lottery, m, m + n, numbers);
        if (ix > -1) {
            System.out.printf("Found subarray %s, width=%d from: %d to %d ",
                    Arrays.toString(Arrays.copyOfRange(lottery, m, m + n)), n, m, m + n - 1);
            System.out.printf("at index: %d%n", ix);
        }
    }
}

उत्पादन

Found subarray [6, 43, 22], width=3 from: 1 to 3 at index: 3
Found subarray [6, 43], width=2 from: 1 to 2 at index: 3
Found subarray [43, 22], width=2 from: 2 to 3 at index: 4

एक और अधिक कुशल कार्यान्वयन इनपुट सरणी में समान मूल्यों के आवर्तक चेक को बायपास करने के लिए नूथ - मॉरिस - प्रैट एल्गोरिदम का उपयोग करेगा ।