2016-07-13 5 views
1

文字列関数を使用せずにC#でループ文を使用せずに文字列がパリンドロームかどうかをチェックする。私は文字列関数なしで行うことができますが、私はループステートメントなしでチェックする方法を知らない。私はインタビューの1つでこの問題に直面しています。文字列関数を使用せずにC#でループ文を使用しないで文字列がパリンドロムかどうかを確認する

using System; 
namespace palindrome 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string s,revs=""; 
      Console.WriteLine(" Enter string"); 
      s = Console.ReadLine(); 
      for (int i = s.Length-1; i >=0; i--) //**i want to replace this for loop** 
      { 
       revs += s[i].ToString(); 
      } 
      if (revs == s) // Checking whether string is palindrome or not 
      { 
       Console.WriteLine("String is Palindrome \n Entered String Was {0} and reverse string is {1}", s, revs); 
      } 
      else 
      { 
       Console.WriteLine("String is not Palindrome \n Entered String Was {0} and reverse string is {1}", s, revs); 
      } 
      Console.ReadKey(); 
     } 
    } 
} 
+1

"文字列関数を使用しない"とは何を意味しているのかは不明ですが、 '.Length'と' [] 'を使用することが許されている場合は、再帰でこれを行うことができます。 –

+0

[C++バージョン](http://stackoverflow.com/questions/34257983/how-to-check-if-string-is-palindrome-without-using-string-functions-in-c) – stuartd

+0

与えられた答えは? – fubo

答えて

2

マイコードが更新されました。ループはなく、文字列メソッドもありません。大文字と小文字の区別は無視されます

(アンナ=真、アンナ= false)を

コード:

string s = Console.ReadLine(); 
bool isPalindrome = s.SequenceEqual(s.Reverse()); 
+0

私は文字列inbuilt関数なしでしたい。 –

+1

@valluriratnlababuいいえ、 'Reverse'は' System.Linq.Enumerable'から来ており、文字列の組み込み関数https://msdn.microsoft.com/en-us/library/bb358497(v=vs.100)ではありません。 aspx – fubo

4

行き当たりばったりあなたは、文字列をループに持って。しかし、あなたはを隠すことができますループを非表示にする暗黙の、例えば。似

bool result = Enumerable 
    .Range(0, s.Length) 
    .All(i => s[i] == s[s.Length - 1 - i]); 

確かに、このソリューションとに近いが

+0

名前は大文字で始まり小文字で終わる回文にもなりうるので、 's [i] == s [s.Length - 1 -i]'だけを比較することはできません。例えば_Anna_は回文型ですが、結果は偽になります – fubo

+0

@fubo:大文字と小文字を区別しない*パインドームを検出したい場合、 '.All(i => char.ToUpper(s [i])== char.ToUpper私たちはCHARのものではなくSTRINGメソッドを使用することは許されません "); –

+0

@fubo私は、質問に答える。それは問題のノブから気を散らしているIMHOです。 –

4

浮気しているあなたは、再帰を使用することを許可されていますか?なぜならもしそうなら:そこループ

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(IsPalindrome("ABCDEFG")); // Prints false 
     Console.WriteLine(IsPalindrome("ABCDCBA")); // Prints true 
    } 

    public static bool IsPalindrome(string text) 
    { 
     return isPalindrome(0, text.Length - 1, text); 
    } 

    private static bool isPalindrome(int indexOfFirst, int indexOfLast, string text) 
    { 
     if (indexOfFirst >= indexOfLast) 
      return true; 

     if (text[indexOfFirst] != text[indexOfLast]) 
      return false; 

     return isPalindrome(indexOfFirst + 1, indexOfLast - 1, text); 
    } 
} 

ありません - と呼ばれている方法の中に隠されていなくても任意の卑劣な小さなものが。

注:string.Lengthと文字列配列演算子は質問の目的では "文字列関数"とはみなされませんでした。

0

私たちはすべてループと実際の文字列関数の直接使用を避けたので、誰もが技術的に正しいと言うのは安全でしょうか?

しかし、すべてのEnumerable拡張メソッドは、ある時点では必ずループを使用します。配列をトラバースするときにループを使用しないようにする方法はありません。あなたが事前に配列の要素数を知っていない限り、コード内でその配列の各要素を明示的に指定します(コードはかなりです)。

回答のバリエーション(再帰を除く)をまとめ、1,000,000回の繰り返しのタイマーで飾りました。あなたはそれらを実行するときに非常に興味深いタイミングを見つけるでしょう。私はコンソールアプリを使いました。

 var lWatch = new Stopwatch(); 

     var s = "ABCDCBA"; 

     bool result; 
     bool isPalindrome; 

     ////Simple array element comparison 
     lWatch.Restart(); 

     for (int j = 0; j < 1000000; j++) 
      result = Enumerable 
       .Range(0, s.Length) 
       .All(i => s[i] == s[s.Length - 1 - i]); 

     lWatch.Stop(); 

     Console.WriteLine(lWatch.Elapsed); 


     ////Sequence reversal and comparison 
     lWatch.Restart(); 

     for (int j = 0; j < 1000000; j++) 
      isPalindrome = s.SequenceEqual(s.Reverse()); 

     lWatch.Stop(); 

     Console.WriteLine(lWatch.Elapsed); 


     ////Simple array element comparison; respecting casing 
     lWatch.Restart(); 

     for (int j = 0; j < 1000000; j++) 
      result = Enumerable 
       .Range(0, s.Length) 
       .All(i => char.ToUpper(s[i]) == char.ToUpper(s[s.Length - 1 - i])); 

     lWatch.Stop(); 

     Console.WriteLine(lWatch.Elapsed); 


     ////Sequence reversal and comparison; respecting casing 
     lWatch.Restart(); 

     for (int j = 0; j < 1000000; j++) 
      isPalindrome = s.Select(c => char.ToUpper(c)).SequenceEqual(s.Select(c => char.ToUpper(c)).Reverse()); 

     lWatch.Stop(); 

     Console.WriteLine(lWatch.Elapsed); 

char.ToUpper()についての議論を覚えていますか?