जावा यह पता लगाने के लिए कि एक सरणी दूसरे का सबसेट है या नहीं
इम को यह पता लगाने में परेशानी हो रही है कि क्या एक विशिष्ट संख्या दूसरे सरणी में है। पहला सरणी 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;
}
}
}
जवाब
ऐसा लगता है कि String::indexOf
इस कार्य के समान एक विधि को इस कार्य में लागू किया जाना चाहिए, जो एक सबर्रे के सूचकांक को खोजने की कोशिश कर रहा है int indexOf(int[] search, int[] input)
।
इसके अलावा, यह देखने के लिए आवश्यकता हो सकती है सभी संभव subarrays के search
subarray ( 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
एक और अधिक कुशल कार्यान्वयन इनपुट सरणी में समान मूल्यों के आवर्तक चेक को बायपास करने के लिए नूथ - मॉरिस - प्रैट एल्गोरिदम का उपयोग करेगा ।