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();
        }
    }
}
4

4 に答える 4

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注:質問の目的上、文字列配列演算子は「文字列関数」とは見なされないと仮定する必要がありました。

于 2016-07-13T11:03:30.743 に答える
2

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

(アンナ = 真、アンナ = 偽)

コード:

string s = Console.ReadLine();
bool isPalindrome = s.SequenceEqual(s.Reverse());
于 2016-07-13T10:41:30.883 に答える
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() に関する引数を覚えておいてください。

于 2016-07-16T08:11:23.343 に答える