मैं दिए गए स्ट्रिंग से दिए गए शब्दों की सरणी को हटाने के लिए सबसे कुशल (गति के मामले में) समाधान चाहता हूं:

अब तक मेरे पास यह काम नहीं कर रहा समाधान है:

const excludeWordList = ['the', 'in', 'a', 'an'];

run("the wall into")
run("paintings covered the wall another words into this")

function run(speech) {

    for(let a = 0; a < excludeWordList.length; a++) {
        speech = speech.replaceAll(excludeWordList[a], '');
    }
    console.log(speech);
}

जैसा कि आप देखते हैं कि कोड में तीन प्रमुख मुद्दे हैं:

  1. यह केवल एक शब्द ही नहीं शब्दों के अंदर के पात्रों को हटाता है

  2. परिणाम एक छंटनी वाली स्ट्रिंग नहीं है, हमारे पास परिणाम के शब्दों के अंदर भी अतिरिक्त स्थान हैं

  3. कोड सबसे कारगर तरीका नहीं है मुझे लगता है!!!, क्योंकि मुझे सभी excludeWordList सरणी के माध्यम से लूप करने की आवश्यकता है।

मैंने अपना फ़ंक्शन my के रूप में लिखा था और जैसा कि आप देखते हैं कि Gainza फ़ंक्शन इस मामले में सबसे कुशल कार्य है:

enter image description here

0
Sara Ree 12 जुलाई 2021, 19:16

5 जवाब

सबसे बढ़िया उत्तर
const excludeWordList = ['the', 'in', 'a', 'an'];

run("the wall into")
run("paintings covered the wall another words into this")

function run(speech) {

    const result = speech.split(' ').filter(word=>!excludeWordList.includes(word)).join(' ')
    console.log(result);
}
1
Martin Gainza Koulaksezian 12 जुलाई 2021, 16:21

मैं गणना समय को कम करने के लिए फ़िल्टर और सेट दृष्टिकोण का उपयोग करता हूं (includes या indexOf के बजाय जो पूरे सरणी को पुन: सक्रिय करता है)

const excluded = new Set(['the', 'in', 'a', 'an']);


function run(speech) {
    return speech.split(' ')
           .filter(word => !excluded.has(word))
           .join(' ');
}


run("the wall into")
run("paintings covered the wall another words into this")
2
Aviad 12 जुलाई 2021, 16:27

व्हाइटस्पेस को शब्द विभाजक के रूप में उपयोग करने वाले समाधान के साथ समस्या यह है कि जब आप उदाहरण के लिए विराम चिह्न का उपयोग करते हैं तो यह असफल हो जाएगा।

'the, Beattles'.split(' ').includes('the')
//=> false

इसके बजाय आपको \b (शब्द सीमा) का उपयोग करना चाहिए:

const excludes = ['the', 'in', 'a', 'an'];
const re = new RegExp('\\b(?:'+excludes.join('|')+')\\b', 'g');

console.log("the.wall.into".replace(re, ''));
console.log("paintings covered the, wall another words into this".replace(re, ''));
1
customcommander 12 जुलाई 2021, 16:44

यहां एक तरीका है जो लूप नहीं करता है, सभी बहिष्कृत शब्दों को एक रेगेक्स के साथ बदल देता है, और एक ट्रिम और अतिरिक्त स्पेस क्लीनअप के साथ समाप्त होता है। यह व्रत की विधि होनी चाहिए। आप सरणी को रेगेक्स में map कर सकते हैं और शब्द सीमाओं को संरक्षित कर सकते हैं \b, जिसे गतिशील रूप से बनाते समय बच जाना चाहिए

const excludeWordList = ['the', 'in', 'a', 'an'];
const reg = new RegExp(excludeWordList.map(w => `\\b${w}\\b`).join('|'), 'g')

run("the wall into")
run("paintings covered the wall another words into this")

function run(speech) {
  speech = speech.replaceAll(reg, '').trim().replace(/\s\s+/g, ' ');
  console.log(speech);
}
2
Cohars 12 जुलाई 2021, 16:39

आप विभाजन() और फ़िल्टर() का उपयोग करने का प्रयास कर सकते हैं।

संपादित करें: indexOf() रैखिक खोज के कारण जटिलता O(N) है। चूंकि हमारे पास शब्दों का एक निश्चित सेट है जिसे हम बाहर करना चाहते हैं, एक सेट में कनवर्ट करना आदर्श है।

new Set() भी O(N) है, लेकिन चूंकि यह केवल एक बार किया जा रहा है और आपके run() को अधिक बार बुलाया जाएगा, यह यहां समझ में आता है। सेट के साथ, .has() में O(1) जटिलता है।

const excludeWordList = ['the', 'in', 'a', 'an'];

const excludeWordSet = new Set(excludeWordList);

run("the wall into")
run("paintings covered the wall another words into this")

function run(speech) {
speech = speech.split(' ').filter((a) => {
return (!excludeWordSet.has(a))
}).join(' ');
  
console.log(speech);
}

filter() में अभी भी O(N) जटिलता है। join() में O(N) है। तो यह अभी भी ओ (एन ^ 2) है, जो आपके प्रारंभिक प्रयास के समान है।

1
Tushar Shahi 12 जुलाई 2021, 16:29