2014-05-20 7 views
5

पर 1 डी सरणी में एक तत्व डालने से मुझे इस प्रश्न को Javascript साक्षात्कार में पूछा गया था और दुख की बात है कि, उस समय स्पष्ट व्यक्ति की तुलना में मैं बेहतर उत्तर नहीं दे सका: नया मान बनाना, नया मान असाइन करना पहले स्थान पर और बाकी की प्रतिलिपि बनाना।पहली स्थिति

पहली स्थिति में 1 डी सरणी में तत्व डालने के लिए समय और स्थान जटिलता के मामले में सबसे अच्छा एल्गोरिदम क्या होगा?

संपादित करें: unshift(), splice(), push() जैसी कोई अंतर्निहित कार्य नहीं है और सभी का उपयोग किया जाना है।

+1

तो तुम के बाद साक्षात्कार .. – Runcorn

+2

हालांकि अनुसंधान एवं विकास जाना नहीं था अगर तुम तो सरणी के समाप्त करने के लिए पहले तत्व जोड़ सरणी के मूल आदेश को संरक्षित करने की जरूरत नहीं है और उस प्रतिलिपि के बाद नई स्थिति – Spektre

+0

@ फ़ज़ी ट्री मैंने नई इकाई को 'अनशिफ्ट()' देखा जो हमें चाहिए, लेकिन साक्षात्कारकर्ता द्वारा इनबिल्ट फ़ंक्शन की अपेक्षा नहीं की गई थी। –

उत्तर

4

काम बस एक वेनिला -1 डी सरणी के सिर पर एक तत्व डालने के लिए है, तो मुझे लगता है कि काफी अपने ही एकमात्र विकल्प यह हे (एन) दृष्टिकोण है:

for(var i = ary.length; i > 0; i--) { 
    ary[i] = ary[i - 1]; 
} 
ary[0] = value; 

उद्देश्य के लिए है सरणी की शुरुआत में तत्वों को सम्मिलित करने के संचालन को अनुकूलित करें (जैसा कि, उस ऑपरेशन को बहुत करने की आवश्यकता है), आप जो कर सकते हैं वह एक डेटा संरचना तैयार करता है जो प्रारंभ और अंत में खाली स्थान के साथ एक सरणी बनाए रखता है, और पहली और आखिरी आबादी वाले आइटम के स्थानों:

_ _ b d f a _ _ 
0 1 2 3 4 5 6 7 

यह आपको ओ (1) अमूर्त समय में अपनी डेटा संरचना की शुरुआत और अंत में वस्तुओं को सम्मिलित करने और हटाने की अनुमति देता है, बस शुरुआत या अंत के सूचकांक को अद्यतन करके और अगले खाली स्थान में मान डालने से, हालांकि सबसे खराब- केस स्पेस उपयोग 2 एन है।

जब सरणी की शुरुआत या अंत भर जाता है, तो पिछले एक के आकार के साथ एक नई सरणी बनाएं, और पुराने सरणी के मानों को नए के बीच में कॉपी करें।

मुझे नहीं पता कि यह आपके साक्षात्कार प्रश्न की बाधाओं के भीतर फिट बैठता है, लेकिन कई साक्षात्कार प्रश्न समस्याओं के बारे में सोचने की आपकी क्षमता का परीक्षण करने और एल्गोरिदम के बारे में आपके ज्ञान का परीक्षण करने और एक सही उत्पादन के बारे में कम जानकारी के बारे में अधिक हैं जवाब।

+0

ऐसा लगता है कि मैंने जो जवाब दिया वह सबसे अच्छा जवाब था। –

+0

ओपी ने विशेष रूप से सेट में पहला होने के लिए सम्मिलित मान के लिए कहा था। एक जगह अभी भी एक चरित्र है (यानी, एक * मूल्य *)। – monners

+0

@monners मैं जिस डेटा संरचना का वर्णन कर रहा हूं वह डेटा की शुरुआत और अंत का ट्रैक रखेगा और तदनुसार डेटा तक पहुंच प्रदान करेगा (कार्यान्वयन विवरण छुपाएं)। जैसा कि मैंने पहले ही कहा है, मुझे यकीन नहीं है कि वह साक्षात्कारकर्ता की अपेक्षाओं की सीमाओं के भीतर है, जिसे अधिक विस्तार से नहीं बताया गया था, लेकिन यदि हम एक साधारण, भरे सरणी का उपयोग करने के लिए सीमित हैं, तो वहां बहुत कुछ नहीं है आत्मनिरीक्षण के लिए कमरा। नए डेटा संरचना सुझाव के लिए – JLRishe

3
var myArr = [0, 1, 2]; 

function spliceToStart (value, inArray) { 
    for (count = inArray.length; count > 0; count--) { 
     inArray[count] = inArray[count-1]; 
    } 
    inArray[0] = value; 
}; 

spliceToStart('Value', myArr); 
console.log(myArr); 

Fiddle

+1

ऐसा लगता है कि आपने [कुछ सरल] (http://jsfiddle.net/WwL94/2/) करने के लिए वास्तव में एक ठोस तरीका तैयार किया है और आपके कोड में एक बग है। लूप के अंदर उन 'if' कथन क्यों हैं (और आपको' if' कथन की आवश्यकता क्यों है)? आपको ब्रेक स्टेटमेंट की आवश्यकता क्यों है? अंत में आपको 'myArr' की लंबाई को कम करने की आवश्यकता क्यों है? मेरे द्वारा प्रदान किए गए चार-रेखा दृष्टिकोण से यह कैसे बेहतर है? – JLRishe

+0

एक त्वरित पहला प्रयास था। एक बहुत साफ संस्करण के लिए संपादन देखें। – monners

+0

हां, अब बहुत साफ है। :) – JLRishe

1

क्या पहले की स्थिति पर एक 1 डी सरणी में एक तत्व डालने के लिए समय और स्थान जटिलता के मामले में सबसे अच्छा एल्गोरिथ्म हो सकता है?

आदेश दिया - O (n)

for(var i=0; i<arr.length; i++) 
    arr[i+1] = arr[i]; 

arr[0] = value; 

अक्रमित - हे (1)

arr[arr.length] = arr[0]; 
arr[0] = value; 

आदेश दिया - हे (1)

arr[arr.length] = value; 

// access ith item 
arr[(arr.length-i-1)] 

// print all items in order 
for (int i=0; i<arr.length; i++) 
    console.log(arr [ (arr.length-i-1) ]); 

इस उदाहरण में, सरणी arr से सम्मानित है, जिसका अर्थ है कि आप सरणी में अंतिम आइटम को पहले के रूप में देखते हैं।:)

+0

आदेश दिया गया तरीके से 'ओ (एन)' से बेहतर करना संभव है? –

+0

@RahulDesai अब इसे जांचें –

+0

जब हम सरणी को उलटते हैं तो सरणी आदेश संरक्षित नहीं किया जाएगा। –

2

एक सरणी @ स्थिति 0 में एक तत्व डालने के लिए एक कार्यात्मक तरीका:

(function (val) { 
    var i = this.length; 
    while (i--){ this[i+1] = this[i]; }; 
    this[0] = val; 
}).call([1,2,3,4], 0); //=> [0,1,2,3,4] 

एक और (थोड़ा तेज)

(function (val) { 
    this.reverse()[this.length] = val; 
    return this.reverse(); 
}).call([1,2,3,4], 0); //=> [0,1,2,3,4] 

jsFiddle example

+0

क्या हम बेहतर कर सकते हैं? –

-2

कैसे इस बारे में:

<script> 
var element = 1; 
var array = [2, 3, 4, 5]; 
array = element + array; 
alert(array[0]); //Prints 1 
</script> 

यह सुनिश्चित नहीं है कि पृष्ठभूमि में यह ईमानदार होने के लिए क्या करता है, लेकिन ऐसा लगता है कि शुरुआत में तत्व जोड़ना है।

+0

यह वास्तव में सरणी को '12,3,4,5' में बदल देता है। 'Console.log (सरणी) 'देखें। इसके संयोजक 'तत्व' और' सरणी [0] '। –

+0

हां, 'तत्व + सरणी' स्ट्रिंग concatenation प्रदर्शन कर रहा है। बस 'element' के मान के रूप में इस कोड को' 50' के साथ चलाने का प्रयास करें। – JLRishe

0

कई लोगों ने ऐसे समाधान पेश किए हैं जो मूल रूप से 'सबकुछ बदलते हैं, फिर पहले तत्व को प्रतिस्थापित करते हैं'। शायद कार्य के बारे में सोचने का एक बेहतर तरीका है 'pos [0] पर तत्व डालें, फिर शेष सरणी के पहले स्थान पर पुराना मान डालें।'

हम इस तरह iteratively यह लिख सकते हैं:

function prepend(array, value) { 
    for (i = 0; i < array.length; i++) { 
     var old = array[i]; 
     array[i] = value; 
     value = old; 
    } 
} 
संबंधित मुद्दे