在不使用字符串函数且不在C#中使用循环语句的情况下检查字符串是否为回文结构

时间:2016-07-13 10:40:03

标签: c# arrays console-application string-function

在不使用字符串函数且不在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 个答案:

答案 0 :(得分:5)

Willy-nilly你必须在字符串上循环;但你可以隐藏循环,使其隐含,例如

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

确保此解决方案与作弊

接近

答案 1 :(得分: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和字符串数组运算符不被视为"字符串函数"就问题而言。

答案 2 :(得分:2)

更新了我的代码。没有循环,没有字符串方法。区分大小写被忽略。

  

(anna = true,Anna = false)

代码:

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

答案 3 :(得分: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()的论点。