2015-07-15 20 views
11

Bir röportaj sorusu için hazırlanıyorum. Sorunun bir cümleyi iade etmektir. "Harika bir gün" gibi "güne harika bir" gibi. Bundan sonra, çoğaltma olup olmadığını sordular, "İyiyim, O iyi mi" gibi "çoğaltır mıyım?" . i şu yöntemBir cümledeki yinelenen kopyaların silinmesi ve silinmesi

public static string reversesentence(string one) 
{ 
    StringBuilder builder = new StringBuilder(); 

    string[] split = one.Split(' '); 
    for (int i = split.Length-1; i >= 0; i--) 
    { 

     builder.Append(split[i]); 
     builder.Append(" "); 
    } 
    return builder.ToString(); 

} 

yazdım Ama ben buraya biraz yardım duplication.Can öldürmesi konusunda fikir almıyorum.

+0

string manipulasyonlarını kullanabilirsiniz – dada

+1

Eh, naif bir yaklaşım "split [i]" nin "split [i + 1]" ile "split [split.Length -1]" arasında olup olmadığını kontrol etmek olabilir. tahmin! – user007

+1

Bir çeşit karma kullanımı da yararlıdır. Sözcüğü bir anahtar olarak kullanın ve ona 1 değerini verin. Birden fazla görünen aynı sözcük, mevcut bir değere 1 atayacaktır. Bunu C# ile nasıl yapacağımı bilmiyorum ama Perl'de her zaman yaparım. – Anthony

cevap

9

Bu çalışır: bu noktalama işaretleri olmadan kelime dayalı farklı olmadığını

public static string reversesentence(string one) 
{ 
    Regex reg = new Regex("\\w+"); 
    bool isFirst = true; 
    var usedWords = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase); 
    return String.Join("", one.Split(' ').Reverse().Select((w => { 
     var trimmedWord = reg.Match(w).Value; 
     if (trimmedWord != null) { 
      var wasFirst = isFirst; 
      isFirst = false; 

      if (usedWords.Contains(trimmedWord)) //Is it duplicate? 
       return w.Replace(trimmedWord, ""); //Remove the duplicate phrase but keep punctuation 

      usedWords.Add(trimmedWord); 

      if (!wasFirst) //If it's the first word, don't add a leading space 
       return " " + w; 
      return w; 
     } 
     return null; 
    }))); 
} 

Temelde, biz karar verirler. Zaten varsa, noktalama işaretini döndürmeniz yeterlidir. Varsa, noktalama işareti dahil olmak üzere tüm sözcüğü yazdırın.

Noktalama da biz sadece (aksi sonuç good he Is , am I yerine good he Is, am I

olurdu String.Join(" ", ...) yapamaz, bu yüzden de sizin örnekte alanı kaldırır Testi:

reversesentence("I am good, Is he good").Dump();

Sonuç:

good he Is, am I

+1

'" (\\ b)? \\ w + (\\ b)? "İsteğe bağlı sınır denetimi fishy görünüyor. Hiç kontrol etmediğin gibi. – nhahtdh

+0

@nhahtdh Kelimeler * kelimeler olarak tanımlanacak sınırlara * ihtiyaç duymaz, ancak * sınırların * olabileceğini belirtir. Örneğin, “A B” - A'nın bir sınırı vardır, B'nin sınırları yoktur. “A” nın sınırları yoktur, “A” nin başlangıçta bir sınırı vardır, ama sonunda değil. Kesinlikle kontrol ediyor ama gerektirmiyor. – Rob

+0

@nhahtdh Nevermind, bugün dümdüz düşünmüyorum .. haklısınız - her halükarda sınırı alması gerekmiyor. – Rob

3

diğer cevap noktalarını kullanarak cümlenin iptali için

soyutlamalar ancak görüşmeciler genellikle uygulamayı görmek istemektedirler. ya da tersine, her zamanki hile, önce cümleyi ters çevirmek ve soldan sağa doğru giderken her kelimeyi tersine çevirmektir. Bir kelimenin sonuna ulaştığınızı söyleyeceğiniz bir boşluk. (Bunun için bir çözüme açık olan Programlama Görüşmeleri bölümüne bakın veya sadece Google'a bakın. Bu, çok popüler bir görüşme sorularıydı). Yaklaşımınız işe yarıyor, ancak fazladan boşluk (O (n)) kullandığınız için kaşlarını çattı. Yalnızca ASCII ile çalışıyorsanız

çiftleri sökme için, aşağıdakileri yapabilirsiniz:

bool[] seenChars = new bool[128]; 
    var sb = new StringBuilder(); 

    foreach(char c in stringOne) 
    { 
     if(!seenChars[c]){ 
      seenChars[c] = true; 
      sb.Append(c); 
     } 
    } 

    return sb.ToString(); 

fikri olmadığını söylemek dizideki endeks olarak kömürün değerini kullanmaktır Bu karakteri daha önce gördünüz ya da görmediniz. Bu yaklaşımla O (1) alanını kullanacaksınız!

Düzenleme: Kelimeleri kopyalıyorsanız, muhtemelen bir HashSet kullanmak ve zaten varsa ekleyerek atlamak isteyebilirsiniz.

+0

Bu, yinelenen karakterleri kaldırır, sözcükleri değil .. – Rob

3

düz geriye döndürülmesi için bu

string sentence = "I am good, Is he good"; 


     var words = sentence.Split(new char[]{' ',','}).Distinct(StringComparer.CurrentCultureIgnoreCase); 

     var stringBuilder = new StringBuilder(); 

     foreach(var item in words) 
     { 
      stringBuilder.Append(item); 
      stringBuilder.Append(" "); 
     } 
     Console.Write(stringBuilder); 
     Console.ReadLine(); 
+0

kodunu güncelleyeceğim 1) 'string.Join' arkadaşın. 2) Sondaki bir alan yaratır 3) Tersine dönmez. – CodesInChaos

9

deneyin:

String.Join(" ", text.Split(' ').Reverse()) 

yinelenen kaldırılması ile ters çevrimi için: ayırıcı olarak sadece boşluk içeren dizeleri

String.Join(" ", text.Split(' ').Reverse().Distinct()) 

Hem iyi çalışıyor. ,'u tanıttığınız zaman sorun daha da zorlaşır. Öyle ki, nasıl ele alınması gerektiğini belirtmeniz gerekiyor.Örneğin, "I am good, Is he good""good he Is am I" veya "good he Is , am I" olmalıdır? Sorudaki örneğiniz "Is" durumunu değiştirir ve ","'u da gruplandırır. Bu benim için yanlış görünüyor.

+0

'Distinct' siparişi değiştirmeyecek mi? – raznagul

+0

@raznagul - Evet, garanti edilir. Algoritma, sırasına göre numaralandırır ve yalnızca ilk gördükleri değerleri verir. – Enigmativity

İlgili konular