पहले डुप्लिकेट तत्व का पता लगाएं


39

एक ऐसी सरणी को देखते हुए जिसमें 1 से a.length तक केवल संख्याएँ होती हैं, पहली डुप्लिकेट संख्या ज्ञात करें जिसके लिए दूसरी घटना में न्यूनतम सूचकांक होता है। दूसरे शब्दों में, यदि 1 से अधिक डुप्लिकेट नंबर हैं, तो वह संख्या लौटाएं, जिसके लिए दूसरी घटना के दूसरे नंबर की दूसरी घटना की तुलना में एक छोटा सूचकांक है। यदि इस तरह के कोई तत्व नहीं हैं, तो आपके कार्यक्रम / कार्य में अपरिभाषित व्यवहार हो सकता है।

उदाहरण:

के लिए a = [2, 3, 3, 1, 5, 2], आउटपुट होना चाहिए firstDuplicate(a) = 3

2 डुप्लिकेट हैं: संख्या 2 और 3. 3 की दूसरी घटना में 2 की दूसरी घटना की तुलना में एक छोटा सूचकांक है, इसलिए उत्तर 3 है।

के लिए a = [2, 4, 3, 5, 1], आउटपुट होना चाहिए firstDuplicate(a) = -1

यह , इसलिए बाइट्स जीत में सबसे छोटा जवाब है।

बोनस: क्या आप इसे O (n) समय जटिलता और O (1) अतिरिक्त स्थान जटिलता में हल कर सकते हैं?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
मार्टिन एंडर

जवाबों:


15

पायथन 2 , 34 बाइट्स

O (n 2 ) time, O (n) space

सहेजे गए 3 बाइट्स @vaultah के लिए धन्यवाद, और @xnor से 3 अधिक!

lambda l:l[map(l.remove,set(l))<0]

इसे ऑनलाइन आज़माएं!


1
यह lambda l:l[map(l.remove,set(l))<0]काम की तरह दिखता है , भले ही मूल्यांकन का क्रम अजीब हो।
xnor

-1जब 'पाद लेख' के बिना कोई डुप्लिकेट नहीं मिलता है तो यह वापस नहीं आता है, क्या यह कोड बाइट्स की ओर नहीं गिना जाता है? मैं कोड गोल्फ के लिए नया हूँ, अगर यह एक बुनियादी सवाल है तो क्षमा करें!
क्रिस_लैंड्स

@Chris_Rands प्रश्न के नीचे संगीतकार ने पूछा कि क्या अपवाद -1 के बजाय ठीक है और ओपी ने कहा कि इसका ठीक है और संगीतकार का जवाब अपवाद है।
LiefdeWen

यह पता लगाने में मुझे थोड़ा समय लगा। बहुत बढ़िया। यह संशोधित करने के बाद सशर्त का उपयोग करके एल के 0 तत्व को प्राप्त करना वास्तव में चतुर है।
Thoth19

क्या पायथन मानक.-पुस्तकालय कार्यों के समय और स्थान की जटिलता की गारंटी देता है जैसे कि सेट.वार्म?
ड्रेकिन

11

जावास्क्रिप्ट (ईएस 6), 47 36 31 25 बाइट्स

सहेजे गए 6 बाइट्स

undefinedकोई समाधान मौजूद नहीं है, तो लौटाता है।

समय जटिलता: O (n) :-)
अंतरिक्ष जटिलता: O (n) :-(

a=>a.find(c=>!(a[-c]^=1))

कैसे?

हम उन्हें नए रूप में सहेज कर पहले से ही सामना करना पड़ा मूल्यों का ट्रैक रखने के गुण मूल सरणी के एक ऋणात्मक संख्याओं का उपयोग करके। इस तरह, वे संभवतः मूल प्रविष्टियों में हस्तक्षेप नहीं कर सकते।

डेमो


25 बाइट्स:a=>a.find(c=>!(a[-c]^=1))

@PirateBay ओह, बिल्कुल। धन्यवाद!
अरनुलद

बस ध्यान दें कि जावास्क्रिप्ट में ऑब्जेक्ट्स को हैश तालिका के रूप में लागू नहीं किया जा सकता है। किसी वस्तु की कुंजी तक पहुँचने की समय जटिलता O (1) नहीं हो सकती है।
tsh

6

गणितज्ञ, 24 बाइट्स

#/.{h=___,a_,h,a_,h}:>a&

Mathematica की पैटर्न मिलान क्षमता इतनी अच्छी है!

Listअमान्य इनपुट के लिए मूल लौटाता है ।

व्याख्या

#/.

इनपुट में, बदलें ...

{h=___,a_,h,a_,h}

एक Listडुप्लिकेट तत्व, इससे पहले कि 0 या अधिक तत्वों के बीच, और डुप्लिकेट के बाद, साथ साथ ...

... :>a

डुप्लिकेट तत्व के साथ।


6

जेली , 5 बाइट्स

Ṛœ-QṪ

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

Ṛœ-QṪ  Main link. Argument: A (array)

Ṛ      Yield A, reversed.
   Q   Unique; yield A, deduplicated.
 œ-    Perform multiset subtraction.
       This removes the rightmost occurrence of each unique element from reversed
       A, which corresponds to the leftmost occurrence in A.
    Ṫ  Take; take the rightmost remaining element, i.e., the first duplicate of A.

œ-सही घटनाओं को हटाता है? टीआईएल
एरिक आउटगॉल्फ जूल

यह -1कोई डुप्लिकेट के लिए वापस जाने के लिए प्रतीत नहीं होता है । एक अपवाद को फेंकना ओपी के अनुसार ठीक है लेकिन मुझे यकीन नहीं है कि 0भले ही यह सीमा में न हो।
निकोलग्राफ जूल


4

जेली , 6 बाइट्स

xŒQ¬$Ḣ

इसे ऑनलाइन आज़माएं!

पहला डुप्लिकेट लौटाता है, या 0 अगर कोई डुप्लिकेट नहीं है।

व्याख्या

xŒQ¬$Ḣ  Input: array M
    $   Operate on M
 ŒQ       Distinct sieve - Returns a boolean mask where an index is truthy
          for the first occurrence of an element
   ¬      Logical NOT
x       Copy each value in M that many times
     Ḣ  Head

यह इस तरह अनुक्रमण का उपयोग करने के लिए गोल्फ खिलाड़ी है ŒQi0ị:।
आउटगॉल्फ जूल

@EriktheOutgolfer यदि कोई डुप्लिकेट नहीं हैं, i0तो 0 वापस आएगा, जहां इंडेक्स होगा और इनपुट के अंतिम मान को 0. 0.
मील की दूरी पर

4

जाप , 7 बाइट्स

æ@bX ¦Y

इसे ऑनलाइन टेस्ट करें!

व्याख्या

 æ@   bX ¦ Y
UæXY{UbX !=Y}  Ungolfed
               Implicit: U = input array
UæXY{       }  Return the first item X (at index Y) in U where
     UbX         the first index of X in U
         !=Y     is not equal to Y.
               In other words, find the first item which has already occured.
               Implicit: output result of last expression

वैकल्पिक रूप से:

æ@¯Y øX

इसे ऑनलाइन टेस्ट करें!

व्याख्या

 æ@   ¯ Y øX
UæXY{Us0Y øX}  Ungolfed
               Implicit: U = input array
UæXY{       }  Return the first item X (at index Y) in U where
     Us0Y        the first Y items of U (literally U.slice(0, Y))
          øX     contains X.
               In other words, find the first item which has already occured.
               Implicit: output result of last expression

4

अजगर, 5 बाइट्स

h.-Q{

परीक्षण सूट

क्यू में प्रत्येक तत्व की पहली उपस्थिति क्यू से निकालें, फिर पहला तत्व वापस करें।


@LuisMendo ठीक है धन्यवाद। भ्रम पैदा करने के लिए क्षमा करें, मुझे पढ़ना सीखना चाहिए ...
श्री एक्सकोडर

@ Mr.Xcoder नहीं, यह ओपी की गलती है। वह जानकारी चुनौती पाठ में होनी चाहिए, लेकिन सिर्फ एक टिप्पणी में
लुइस मेंडू

4

Dyalog APL, 27 24 20 19 13 12 11 बाइट

⊢⊃⍨0⍳⍨⊢=⍴↑∪

अब v16 पर निर्भर नहीं करने के लिए संशोधित! इसे ऑनलाइन आज़माएं!

कैसे? (इनपुट एन के साथ )

  • ⊢⊃⍨...- इस सूचकांक में एन :
    • ⍴↑∪- एन के साथ डुप्लिकेट हटाए गए, राइट-पैडेड के साथ एन0 फिट करने के लिए
    • ⊢=- एन के साथ तत्व-वार समानता
    • 0⍳⍨- पहले का सूचकांक 0। `

कोई बात नहीं, मैंने सवाल को गलत बताया। हालांकि पर्याप्त परीक्षण के मामले नहीं ...
Uriel

आपको गुमराह करने के लिए क्षमा करें, मैंने भी प्रश्न को गलत बताया।
मील

मुझे 36 बाइट्स लगती हैं।
एडम जूल

हे भगवान, कोटा अंडरबार नहीं है ⎕AV, क्या यह है?
ज़ाचरी जूल

@ Zacharý सही, क्लासिक इसे ⎕U2378 लोड होने पर अनुवादित करता है । इसे ऑनलाइन आज़माएं!
आदम

3

पायथन 3 , 94 92 बाइट्स

O (n) समय और O (1) अतिरिक्त मेमोरी।

def f(a):
 r=-1
 for i in range(len(a)):t=abs(a[i])-1;r=[r,i+1][a[t]<0>r];a[t]*=-1
 return r

इसे ऑनलाइन आज़माएं!

एल्गोरिथ्म का स्रोत

व्याख्या

एल्गोरिथ्म का मूल विचार प्रत्येक तत्व के माध्यम से बाएं से दाएं चलना है, जो संख्याएं दिखाई दी हैं उन पर नज़र रखें और संख्या को पहले से ही दिखाई देने वाली संख्या तक पहुंचने पर वापस लौटें, और प्रत्येक तत्व को ट्रेस करने के बाद -1 लौटें।

हालांकि, यह उन संख्याओं को संग्रहीत करने के लिए एक चतुर तरीके का उपयोग करता है जो अतिरिक्त मेमोरी का उपयोग किए बिना दिखाई देते हैं: उन्हें संख्या द्वारा अनुक्रमित तत्व के संकेत के रूप में संग्रहीत करने के लिए। उदाहरण के लिए, मैं इस तथ्य का प्रतिनिधित्व कर सकता हूं 2और 3होने a[2]और a[3]नकारात्मक होने से पहले ही प्रकट हो गया है , यदि सरणी 1-अनुक्रमित है।


यह i[i]> n के लिए क्या करेगा ?
डाउनगेट

@Downgoat ने सवाल फिर से पढ़ा।
लीक नन

सवाल यह कहता 1है कि। लेकिन एक [i] = a.length के लिए क्या यह सीमा से बाहर नहीं जाएगा?
डाउनगेट

@ डनगोतt=abs(a[i])-1=a.length-1
नन


3

पर्ल 6 , 13 बाइट्स

*.repeated[0]

कोशिश करो


व्याख्या

  • *एक टर्म स्थिति में है इसलिए पूरे बयान एक है WhateverCode लैम्ब्डा।

  • वह .repeatedविधि है जिसके परिणामस्वरूप प्रत्येक मूल्य में पहली बार प्रत्येक मूल्य को देखा गया था।

    say [2, 3, 3, 3, 1, 5, 2, 3].repeated.perl; # (3, 3, 2, 3).Seq
    #   (      3, 3,       2, 3).Seq
  • [0]सिर्फ Seq में पहला मान लौटाता है ।
    यदि कोई मान नहीं है, तो निल लौटाया जाता है।
    ( नील विफलता के प्रकारों का आधार है , और सभी प्रकार के अपने स्वयं के अपरिभाषित मूल्य हैं, इसलिए अधिकांश अन्य भाषाओं में नील अपरिभाषित मूल्य से अलग हैं)


ध्यान दें कि जबसे Seq लागू.repeated होता है इसका मतलब है कि यह तब तक कोई काम करना शुरू नहीं करता है जब तक आप मूल्य नहीं मांगते हैं, और यह केवल वही काम करता है जो आप मांगते हैं। इसलिए यह तर्क करना आसान होगा कि इसमें सबसे खराब O (n)  समय जटिलता है, और सबसे अच्छा O (2)  समय जटिलता है यदि दूसरा मान पहले का दोहराव है। ऐसा ही शायद स्मृति जटिलता के बारे में कहा जा सकता है।


3

एपीएल (डायलॉग) , 20 बाइट्स

n/⍨(,≢∪)¨,\n←⎕,2⍴¯1

इसे ऑनलाइन आज़माएं!

2⍴¯1 ऋणात्मक एक r को लंबाई-दो सूची में बदल दिया गया

⎕, इनपुट मिलता है (mnemonic: कंसोल बॉक्स) और उस के लिए प्रस्तुत करना

n← कि n में स्टोर करें

,\n के  उपसर्ग (लि। संचयी संघटन)

( प्रत्येक उपसर्ग के लिए निम्नलिखित tacit फ़ंक्शन लागू करें

, [] ravel (बस यह सुनिश्चित करता है कि उपसर्ग एक सूची है)

 से अलग

 अद्वितीय तत्व [?] (क्या उपसर्ग में डुप्लिकेट है?)

n/⍨n  को फ़िल्टर करने के लिए उपयोग करें (पहले तक सभी तत्वों को हटा देता है जिसके लिए एक डुप्लिकेट पाया गया था)

 उसमें से पहला तत्व उठाओ


वाह, आपने तीन बार बाजी मारी। फिर भी, +1। और क्या आप इस बात की व्याख्या जोड़ सकते हैं कि यह कैसे काम करता है?
ज़ाचारि

@ Zacharý जाहिरा तौर पर मैं सिर्फ गेंद रोलिंग मिल की जरूरत है। हेयर यू गो।
Adám


3

APL (Dyalog) , 11 बाइट्स

के अनुसार नए नियमों , एक त्रुटि फेंकता है तो कोई डुप्लिकेट मौजूद हैं।

⊢⊃⍨⍬⍴⍳∘≢~⍳⍨

इसे ऑनलाइन आज़माएं!

⍳⍨ प्रत्येक तत्व की पहली घटना के संकेत

~ से निकाला गया

⍳∘≢ सभी सूचकांकों के

⍬⍴ एक स्केलर में फेरबदल करें (यदि कोई डेटा उपलब्ध नहीं है तो शून्य देता है)

⊃⍨ उपयोग करने के लिए (शून्य पर त्रुटि देता है)

 बहस


ठीक है, हाँ, जब नियम बदले जाते हैं, तो बेशक आप उन सभी को हरा सकते हैं!
ज़ाचारि

अच्छा, मैंने तुम्हें बांध दिया।
Zacharý

3

एपीएल, १५

{⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}

लगता है जैसे हम डुप्लिकेट नहीं होने पर -1 के बजाय 0 वापस कर सकते हैं, (टिप्पणी के लिए धन्यवाद एडम)। तो 3 बाइट्स कम।

थोड़ा सा विवरण:

⍵⍳⍵         search the argument in itself: returns for  each element the index of it's first occurrence
(⍳⍴⍵)~⍵⍳⍵   create a list of all indexes, remove those found in ⍵⍳⍵; i.e. remove all first elements
⊃⍵[...]     of all remaining elements, take the first. If the array is empty, APL returns zero

संदर्भ के लिए, पुराने समाधान ने सूची में -1 को अंत में जोड़ा, इसलिए यदि सूची खाली हो गई, तो इसमें -1 की जगह होगी और पहला तत्व -1 होगा।

{⊃⍵[(⍳⍴⍵)~⍵⍳⍵],¯1}

इसे tryapl.org पर आज़माएं


आप इसके बजाय एक शून्य वापस कर सकते हैं¯1 , इसलिए {⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}करना चाहिए।
शाम

3

रेटिना , 26 24 बाइट्स

1!`\b(\d+)\b(?<=\b\1 .*)

इसे ऑनलाइन आज़माएं! स्पष्टीकरण: \b(\d+)\bबदले में प्रत्येक संख्या से मेल खाता है, और फिर लुकबाइंड यह देखने के लिए देखता है कि क्या संख्या एक डुप्लिकेट है; अगर यह मैचों की गिनती के बजाय 1सेंट मैच !आउटपुट है। दुर्भाग्य से पहले लग रही है काम करने के लिए नहीं लग रहा है, अन्यथा यह कई बाइट्स बचा होगा। संपादित करें: बिना किसी मैच के -1वापसी मूल्य का अनुपालन करने के लिए 7 बाइट्स जोड़े गए । @MartinEnder के लिए 2 बाइट्स धन्यवाद सहेजे गए।


2
रिकॉर्ड के लिए, लुकबैक बैकट्रैक नहीं होगा। यदि आप इसे पहले डालने की कोशिश करते हैं तो यह काम करने से रोकता है। मैंने कई बार यह गलती की है, और मार्टिन हमेशा मुझे सुधारता है।
फ्राईअमईएग्मन

मुझे एक लुकबाइंड के बजाय लुकहेड का उपयोग करके 30 बाइट्स मिले। इसके अलावा, नियम अब कहते हैं कि आपको वापस जाने की आवश्यकता नहीं है -1
वैल्यू इंक

@ValueInk लेकिन उस टेस्ट केस के लिए सही उत्तर 3 है ...
नील

ओह। मैंने चुनौती को गलत बताया, हूप्स
वैल्यू इंक

2

MATL , 8 बाइट्स

&=Rsqf1)

यदि कोई डुप्लिकेट मौजूद नहीं है, तो एक त्रुटि (आउटपुट के बिना) देता है।

MATL ऑनलाइन पर कोशिश करो !

व्याख्या

&=   % Implict input. Matrix of all pairwise equality comparisons
R    % Keep the upper triangular part (i.e. set lower part to false)
s    % Sum of each column
q    % Subtract 1
f    % Indices of nonzero values
1)   % Get first. Gives an error is there is none. Implictly display

2

आर, 34 बाइट्स

c((x=scan())[duplicated(x)],-1)[1]

@Djhurio के उत्तर से कुछ वर्ण काट लें, हालांकि टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है।


ओह ... मैंने यह जवाब नहीं देखा; यह पहले के लिए अच्छा है जब लापता मूल्यों की आवश्यकता होती है -1लेकिन नए चश्मे के साथ, मैं इसे और भी नीचे ले जाने में कामयाब रहा। यह अभी भी ठोस है और यह जिस तरह से उसने किया है उससे यह एक अलग दृष्टिकोण है, इसलिए मैं आपको +1 दूंगा!
Giuseppe

2

जे, 17 16 बाइट्स

(*/{_1,~i.&0)@~:

कैसे?

(*/{_1,~i.&0)@~:

             @~: returns the nub sieve which is a vector with 1 for the first occurrence of an element in the argument and 0 otherwise

        i.&0     returns the first index of duplication

    _1,~         appends _1 to the index

 */              returns 0 with duplicates (product across nub sieve)

     {           select _1 if no duplicates, otherwise return the index



2

डायलॉग एपीएल क्लासिक, 18 वर्ण

में ही काम करता है ⎕IO←0

     w[⊃(⍳∘≢~⍳⍨)w←¯1,⎕]

तर्क के तत्वों के सूचकांकों की सूची से हटाए गए "-1" की सूची में उसके nub के सूचकांकों को हटा दें और फिर जो बचा है उसका पहला भाग चुनें। यदि हटाने के बाद केवल एक खाली वेक्टर रहता है, तो इसका पहला तत्व परिभाषा 0 है जो वांछित -1 का उत्पादन करने वाले विस्तारित तर्क को अनुक्रमित करने के लिए उपयोग किया जाता है।


उम ... यादृच्छिक प्रमुख स्थानों के साथ क्या है? एक बाइट द्वारा मुझे आउट करने के लिए +1 ।
ज़ाचारि

आप लौटने के बजाय एक त्रुटि फेंक सकते हैं¯1 , जिससे आप हटा सकते हैं ¯1,और उपयोग कर सकते हैं ⎕IO←1
5


2

जावा (ओपनजेडके 8) , 65 117 109 बाइट्स

पिछला 65 बाइट समाधान:

r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}

नया उपाय। 19 बाइट्स के लिए शामिल हैंimport java.math.*;

-8 बाइट्स @Nevay को धन्यवाद

r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}

इसे ऑनलाइन आज़माएं!

संपादित करें

मेरे मूल कार्यक्रम में एल्गोरिथ्म ठीक था, लेकिन उपयोग किए गए डेटाटाइप के स्थिर आकार का मतलब था कि आकार के एक निश्चित सीमा से ऊपर जाने के बाद यह काफी जल्दी टूट गया।

मैंने इसे समायोजित करने के लिए कार्यक्रम की मेमोरी सीमा को बढ़ाने के लिए गणना में उपयोग किए गए डेटाटाइप को बदल दिया है ( या BigIntegerइसके बजाय मनमाना परिशुद्धता के लिए उपयोग intकर रहा है long)। हालांकि, यह इस बात को बहस का विषय बनाता है कि क्या यह O(1)अंतरिक्ष जटिलता के रूप में गिना जाता है या नहीं ।

मैं अपनी व्याख्या को नीचे छोड़ दूंगा, लेकिन मैं यह जोड़ना चाहता हूं कि मैं अब मानता हूं कि O(1)कुछ धारणाएं बनाए बिना अंतरिक्ष जटिलता को प्राप्त करना असंभव है ।

प्रमाण

Nपूर्णांक के रूप में परिभाषित करें कि ऐसा 2 <= N

आज्ञा Sदेना एक सूची है जो यादृच्छिक पूर्णांक की एक श्रृंखला का प्रतिनिधित्व करती है [x{1}, ..., x{N}], जहां x{i}बाधा है 1 <= x{i} <= N

समय जटिलता (बिग-ओ संकेतन में) इस सूची के माध्यम से पुनरावृत्ति करने के लिए आवश्यक है जो कि एक बार प्रति तत्व है O(n)

दी गई चुनौती सूची में पहले डुप्लिकेट मान को खोजने के लिए है। अधिक विशेष रूप से, हम पहले मूल्य की खोज कर रहे हैं Sजो सूची में पिछले आइटम का डुप्लिकेट है।

चलो pऔर qऐसी है कि सूची में दो तत्वों के पदों हो p < qऔर x{p} == x{q}। हमारी चुनौती सबसे छोटी हो जाती है जो qउन स्थितियों को पूरा करती है।

इस समस्या के लिए स्पष्ट दृष्टिकोण एस के माध्यम से पुनरावृत्त करना है और जांचें कि क्या हमारी x{i}सूची में मौजूद है T: यदि x{i}मौजूद नहीं है T, तो हम इसे स्टोर करते हैं T। यदि x{i}इसमें मौजूद है T, तो यह पहला डुप्लिकेट मान है और इसलिए सबसे छोटा है q, और जैसे हम इसे वापस करते हैं। यह अंतरिक्ष दक्षता है O(n)

समय की O(1)जटिलता को बनाए रखते हुए अंतरिक्ष जटिलता को प्राप्त करने के लिए O(n), हमें सूची में प्रत्येक वस्तु के बारे में अद्वितीय जानकारी को अंतरिक्ष की सीमित मात्रा में संग्रहीत करना होगा। इस वजह से, किसी भी एल्गोरिथ्म पर एक ही तरीका प्रदर्शन कर सकता हैO(1)अंतरिक्ष जटिलता है अगर: 1. N को किसी विशेष परिमित डेटाटाइप के लिए अधिकतम संभव मानों को संग्रहीत करने के लिए आवश्यक मेमोरी के अनुरूप एक ऊपरी बाउंड दिया जाता है। 2. एक अपरिवर्तनीय चर के पुन: असाइनमेंट को जटिलता के खिलाफ नहीं गिना जाता है, केवल चर की संख्या (एक सूची जिसमें कई चर होते हैं)। 3. (अन्य उत्तरों के आधार पर) सूची है (या कम से कम, सूची के तत्व) परस्पर हैं, और सूची का डेटाटाइप एक हस्ताक्षरित पूर्णांक के रूप में पूर्व निर्धारित है, जिससे सूची में आगे तत्वों को किए जाने वाले बदलावों की अनुमति मिलती है। अतिरिक्त मेमोरी का उपयोग किए बिना।

1 और 3 दोनों को डेटाटाइप के बारे में मान्यताओं और विशिष्टताओं की आवश्यकता होती है, जबकि 2 की आवश्यकता होती है कि केवल उन वेरिएबल्स के आकार के बजाय अंतरिक्ष जटिलता की गणना के लिए चर की संख्या पर विचार किया जाना चाहिए। यदि इन धारणाओं में से कोई भी स्वीकार नहीं किया जाता है, तो O(n)समय जटिलता और O(1)अंतरिक्ष जटिलता दोनों को प्राप्त करना असंभव होगा ।

व्याख्या

किसका लड़का, यह एक मस्तिष्क शक्ति का एक सा सोचने के लिए एक लंबे समय तक एक शर्मनाक समय लिया ।

तो, बोनस के लिए जाना मुश्किल है। हमें पूरी सूची पर ठीक एक बार काम करने और उन मूल्यों को ट्रैक करने की आवश्यकता है जो हमने पहले ही अतिरिक्त अंतरिक्ष जटिलता के बिना पुनरावृत्त कर दिए हैं।

बिट हेरफेर उन समस्याओं को हल करता है। हम अपने O(1)'स्टोरेज' को, पूर्णांक की एक जोड़ी को आरंभीकृत करते हैं, फिर सूची के माध्यम से पुनरावृति करते हैं, या हमारे पहले पूर्णांक में ith बिट को इन्न-बिट करते हैं और उस परिणाम को दूसरे तक संग्रहीत करते हैं।

उदाहरण के लिए, यदि हमारे पास है 1101, और हम एक OR ऑपरेशन करते हैं 10, तो हम प्राप्त करते हैं 1111। यदि हम एक और OR के साथ करते हैं 10, तो हमारे पास अभी भी है 1101

Ergo, एक बार जब हम OR ऑपरेशन करते हैं और उसी नंबर के साथ समाप्त होते हैं, तो हमने अपना डुप्लिकेट ढूंढ लिया है। सरणी में कोई भी डुप्लिकेट कार्यक्रम को चलाने और अपवाद को फेंकने का कारण नहीं बनता है।


इसके अलावा, आपके दूसरे परीक्षण में 100 नंबर भी शामिल है, लेकिन यह असंभव है क्योंकि यह सरणी केवल 5 लंबी है
स्कूलबॉय

इसके अलावा, यह विफल रहता है क्योंकि इंट में पर्याप्त भंडारण नहीं होता है।
स्कूलबॉय

@SchoolBoy अच्छी पकड़। मेरी एकमात्र समस्या यह है कि सरणी के आकार पर कोई ऊपरी सीमा नहीं लगती है, इसलिए मैं स्मृति समस्याओं को हल करने के लिए अपने कोड को वास्तविक रूप से नहीं बदल सकता।
Xanderhall

@Xanderhall True, लेकिन मुझे ऐसा लगता है कि 32 (या यदि आप एक लंबे, 64 का उपयोग करते हैं) संख्या बहुत कम है: पी। किसी भी तरह से, इनपुट पर एक सीमा लागू करना, और फिर आवश्यक अधिकतम मेमोरी आवंटित करना और इसे O (1) मेमोरी कॉल करना केवल एक धोखा है। यह अभी भी O (n) है क्योंकि यदि इनपुट का आकार बढ़ता है, तो यह मेमोरी के लिए ऊपरी बाध्य होगा। जो यह भी है कि मुझे क्यों लगता है कि O (n) O (1) एल्गोरिथ्म बनाना असंभव है
SchoolBoy

@Xanderhall PS मैं आपके 65 के करीब आ रहा हूं, मैं 67 बाइट्स पर हूं: p
स्कूलबॉय

2

PHP, 56 44 38 32 बाइट्स

for(;!${$argv[++$x]}++;);echo$x;

इस तरह से चलाएं:

php -nr 'for(;!${$argv[++$x]}++;);echo$x;' -- 2 3 3 1 5 2;echo
> 3

व्याख्या

for(
  ;
  !${                 // Loop until current value as a variable is truthy
    $argv[++$x]       // The item to check for is the next item from input
  }++;                // Post increment, the var is now truthy
);
echo $x;              // Echo the index of the duplicate.

बदलाव

  • सरणी के बजाय चर का उपयोग करके 12 बाइट्स सहेजे गए
  • जब कोई मैच न हो तो "अपरिभाषित व्यवहार" नियम का उपयोग करके 6 बाइट्स सहेजे।
  • प्रत्येक लूप के बाद 1 पर सेट करने के बजाय पोस्ट-इंक्रीमेंट का उपयोग करके 6 बाइट्स सहेजे

जटिलता

जैसा कि कोड के टिप्पणी किए गए संस्करण से देखा जा सकता है, समय जटिलता रैखिक है O(n)। स्मृति के संदर्भ में, अधिकतम n+1चर को असाइन किया जाएगा। तो वह है O(n)


एक अजीब एन्कोडिंग का उपयोग नहीं करने के लिए धन्यवाद। लेकिन आपको error_reportingविकल्प को बाइट काउंट (या उपयोग -n, जो मुफ़्त है) में जोड़ना चाहिए ।
टाइटस

हम पहले भी यहाँ आ चुके हैं। PHP नोटिस और चेतावनी आग्नेय है। मैं उन्हें भी पाइप कर सकता हूं /dev/null, जो समान है।
13

मैं गलत टिप्पणियों को याद करता हूं। :) इस O (n) नहीं है?
टाइटस

हाँ, यह रैखिक है
13

O(1)अतिरिक्त स्थान के लिए यह कैसा है ? आप सचमुच एक नया चर प्रति असाइन कर रहे हैं n, जोO(n)
Xanderhall

2

Java 8, 82 78 76 बाइट्स अब व्यवहार्य नहीं हैं, 75 67 64 बाइट्स नीचे संपादित करें

एक लंबो कार्य के रूप में:

a->{Set<Long>s=new HashSet<>();for(long i:a)if(!s.add(i))return i;return-1;}

शायद बहुत छोटा बनाया जा सकता है, यह बहुत जल्दी था।

स्पष्टीकरण:

a->{                                //New lambda function with 'a' as input
    Set<Long>s=new HashSet<>();     //New set
    for(long i:a)                   //Iterate over a
        if(!s.add(i))               //If can't add to s, already exists
            return i;               //Return current value
        return-1;                   //No dupes, return -1
}

* संपादित करें *

75 67 64 बाइट्स नेगेटिव रणनीति का उपयोग करते हुए:

a->{int i=0,j;while((a[j=Math.abs(a[i++])-1]*=-1)<0);return++j;}

इसे ऑनलाइन आज़माएं!

(-3 बाइट्स @ नवीन को धन्यवाद)

स्पष्टीकरण:

a->{                                         //New lambda expression with 'a' as input
    int i=0,j;                               //Initialise i and declare j
    while((a[j=Math.abs(a[i++])-1]*=-1)<0);  //Negate to keep track of current val until a negative is found
    return++j;                               //Return value
}

ट्रैक पर रखने के लिए, सरणी के ऊपर लूप्स। यदि कोई ठगी नहीं है, तो बस चलाता है और एक त्रुटि फेंकता है।

ये दोनों O (n) समय और O (n) अंतरिक्ष जटिलता पर काम करते हैं।


यह ध्यान देने योग्य है कि यह एक मेमने को लौटाने की आवश्यकता होगी Number, क्योंकि ilongऔर ए -1है int
जेकब

@ जैकब आवश्यक नहीं, -1 जा रहा है एक इंट स्वचालित रूप से एक लंबे समय के लिए कलाकारों को स्पष्ट रूप से निर्दिष्ट किए बिना डाली जाएगी
स्कूलबॉय

यह अनुमानित रूप से डाली जाएगी long, लेकिन Longलैंबडा को सौंपे जाने के लिए आवश्यक नहीं है Function। क्या आपने इसका परीक्षण किया? बावजूद, उस समाधान को आपके नए के साथ बदला जा सकता है।
जैकब

आप Set s=new HashSet();7 बाइट्स को बचाने के लिए कच्चे प्रकार का उपयोग कर सकते हैं । (इसके अलावा: afaik के आयात java.util.*;को बाइट काउंट में शामिल करना होगा -> +19 बाइट्स।) रिटर्न स्टेटमेंट हो सकता है return++j, अगर-स्टेटमेंट को हटाया जा सकता है a->{int i=0,j;for(;(a[j=Math.abs(a[i++])-1]*=-1)<0;);return++j;}(-3 बाइट्स)।
नेवय

2

ब्रेकीलॉग , 5 बाइट्स

a⊇=bh

इसे ऑनलाइन आज़माएं!

व्याख्या

a⊇=bh  Input is a list.
a      There is an adfix (prefix or suffix) of the input
 ⊇     and a subsequence of that adfix
  =    whose elements are all equal.
   b   Drop its first element
    h  and output the first element of the rest.

अंतर्निहित उप- aसूचियाँ पहले सभी उपसर्गों को लंबाई के बढ़ते क्रम में, फिर लंबाई के घटते क्रम में प्रत्यय देती हैं। इस प्रकार आउटपुट को सबसे कम उपसर्ग द्वारा उत्पादित किया जाता है जो इसे अनुमति देता है, यदि कोई हो। यदि किसी उपसर्ग में कोई डुप्लिकेट नहीं है, तो बाकी प्रोग्राम इसके लिए विफल रहता है, क्योंकि समान तत्वों की प्रत्येक बाद की लंबाई 1 है, और इसकी पूंछ का पहला तत्व मौजूद नहीं है। यदि किसी उपसर्ग में बार-बार तत्व होता है, तो हम लंबाई -2 का चयन कर सकते हैं जिसमें दोनों शामिल हैं, और कार्यक्रम बाद में लौटता है।


एक और 5 बाइट्स समाधान: a⊇Ċ=hजो केवल लंबाई -2 सबसेट को देखता है।
घातक

1

सी #, 145 बाइट्स

using System.Linq;a=>{var d=a.Where(n=>a.Count(t=>t==n)>1);return d.Select((n,i)=>new{n,i}).FirstOrDefault(o=>d.Take(o.i).Contains(o.n))?.n??-1;}

संभवतः एक साधारण लूप के साथ C # में ऐसा करने का एक छोटा तरीका है लेकिन मैं इसे Linq के साथ आज़माना चाहता था।

इसे ऑनलाइन आज़माएं!

पूर्ण / प्रारूपित संस्करण:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<int[], int> f = a =>
            {
                var d = a.Where(n => a.Count(t => t == n) > 1);
                return d.Select((n, i) => new { n, i }).FirstOrDefault(o => d.Take(o.i).Contains(o.n))?.n ?? -1;
            };

            Console.WriteLine(f(new[] { 2, 3, 3, 1, 5, 2 }));
            Console.WriteLine(f(new[] { 2, 4, 3, 5, 1 }));

            Console.ReadLine();
        }
    }
}

यहाँ सरल लूप संस्करण है। लेकिन मुझे Linq संस्करण बहुत पसंद है।
LiefdeWen

@LiefdeWen इसे एक उत्तर के रूप में पोस्ट करें :) हालाँकि मैं आमतौर पर Linq को बेहतर पसंद करता हूँ :) शायद यह Linq के साथ छोटा हो सकता है, लेकिन मुझे अब यकीन है।
TheLethalCoder

नहीं, यह प्रश्न अतिपिछड़ा है और मैं आपको इस प्रश्न के लिए वोट देना चाहूंगा।
LiefdeWen

1

हास्केल , 78 69 बाइट्स

 fst.foldl(\(i,a)(j,x)->(last$i:[j|i<0,elem x a],x:a))(-1,[]).zip[1..]

इसे ऑनलाइन आज़माएं!

@Nimi की बदौलत 9 बाइट्स बचाए

सूची के माध्यम से एक मूल मार्ग। यदि वर्तमान तत्व अभी तक नहीं देखा गया है ( i<0) और संचायक सूची ( elem x a) में है, तो वर्तमान सूचकांक को संग्रहीत करें। और, इंडेक्स -1 रखें। किसी भी स्थिति में, संचयकर्ता सूची में वर्तमान तत्व जोड़ें।

संपादित करें : मैंने प्रश्न को ध्यान से नहीं पढ़ा: यह कोड डुप्लिकेट तत्व के दूसरे तत्व के सूचकांक को आउटपुट करता है।


आप उपयोग कर सकते हैं "छोटा सशर्त" हमारे से "हास्केल में गोल्फ के लिए सुझाव" : \ ... ->(last$i:[j|i<0,elem x a],x:a)। इसके अलावा: f=अनाम कार्यों की अनुमति नहीं है , क्योंकि इसकी कोई आवश्यकता नहीं है ।
नीमहाली

@ टिप के लिए धन्यवाद!
जफर

1

पायथन 2, 71 65 बाइट्स

Noneयदि कोई डुप्लिकेट तत्व नहीं है, तो लौटाता है

संपादित करें: -6 बाइट्स @ musicman523 के लिए धन्यवाद

def f(n):
 for a in n:
	u=-abs(a)
	if n[u]<0:return-u
	n[u]=-n[u]

इसे ऑनलाइन आज़माएं!

O (n) समय जटिलता, O (n) अंतरिक्ष जटिलता, O (1) सहायक स्थान।

चूंकि इनपुट सूची में O (n) स्थान का उपयोग किया गया है, इसलिए अंतरिक्ष जटिलता इसके द्वारा बाध्य है। मतलब, हमारे पास O (n) से कम जगह की जटिलता नहीं हो सकती है

मूल सूची को संशोधित करता है, अगर यह अनुमति नहीं है तो हम इसे 129 बाइट्स के साथ एक ही जटिलता में कर सकते हैं

व्याख्या

चूँकि प्रत्येक तत्व 0 से अधिक है और सूची के आकार से कम या बराबर है, सूची में प्रत्येक तत्व a, सूचकांक a - 1 (0 अनुक्रमित) पर एक तत्व है। हम यह कहकर इसका फायदा उठाते हैं कि यदि सूचकांक में तत्व नकारात्मक है, तो हम इसे पहले देख चुके हैं।

सूची n में प्रत्येक तत्व के लिए, हम यू को नकारात्मक मान देते हैं। (हम इसे नकारात्मक होने देते हैं क्योंकि अजगर नकारात्मक सूचकांकों के साथ सूचियों को सूचीबद्ध कर सकता है, और हमें अन्यथा करने की आवश्यकता होगी u=abs(a)-1 ) यदि सूची में सूचकांक यू में तत्व नकारात्मक है, तो हम इसे पहले देख चुके हैं और इसलिए वापस लौटा सकते हैं ( -प्राप्त करने के लिए) का पूर्ण मूल्य, जैसा कि सभी तत्व सकारात्मक हैं) । वरना हम इंडेक्स यू में तत्व को नकारात्मक मानते हैं, यह याद रखने के लिए कि हमने पहले मूल्य का एक तत्व देखा है।


अच्छी नौकरी! 65 बाइट्स
संगीतज्ञ 523

क्या आप सुनिश्चित हैं कि यह O (1) मेमोरी में है? आप अभी भी मेमोरी के n बिट्स को स्टोर करने के लिए उपयोग कर रहे हैं, जो संख्या पहले ही देखी जा चुकी हैं, भले ही साइन में बिट्स हों। ऐसा लगता है कि यह भेस में ओ (एन) है
गेहूं जादूगर

तकनीकी रूप से यह O (n) स्पेस - n साइन बिट्स का उपयोग करता है । यदि सरणी केवल 1और के बीच मानों को पकड़ सकती है n, जैसे कि यह कैसे दिया गया था, तो यह स्पष्ट रूप से काम नहीं करता है।
ओलिवर नी

यह वास्तव में केवल संख्याओं के लिए आपके द्वारा चुने गए प्रतिनिधित्व के लिए नीचे आता है। यदि अहस्ताक्षरित संख्याओं का उपयोग किया जाता है, तो यह O (n) सहायक स्थान है। यदि हस्ताक्षरित संख्याओं का उपयोग किया जाता है, तो साइन बिट पहले से ही है, जिसका अर्थ है ओ (1) सहायक स्थान।
हेल्वैडैम विस्मयादिबोधक

मैं वहां आपसे सहमत हूं। जब तक आप साइन बिट का उपयोग नहीं करते , तब तक मैं व्यक्तिगत रूप से आपको साइन इन किए गए पूर्णांक का उपयोग करने देता हूँ, यह एल्गोरिथ्म के बारे में होना चाहिए न कि सिस्टम की तकनीकीताओं के बारे में। कहा जा रहा है कि मुझे लगता है कि अगर आप साइन बिट्स का उपयोग करने जा रहे हैं तो आपको उन्हें गिनना होगा। मुझे लगता है कि यह जवाब बहुत चालाक है। अगर आज कोई वोट बचता है तो मैं इसे नोटबंदी का प्रतिकार करूंगा।
गेहूं जादूगर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.