2014-12-11 5 views
0
namespace Palindrome 
{ 
    class Program 
    { 
     public static bool IsPalindrome(string s) 
     { 
      int min = 0; 
      int max = s.Length - 1; 
      while (true) 
      { 
       if (min > max) // True if we've compared up to, and then gone passed the middle of the string. 
        return true; 

       if (char.ToLower(s[min++]) != char.ToLower(s[max])) 
        return false; 
      } 
     } 

     static void Main(string[] args) 
     { 
      string [] words = { 
           "civic", 
           "deified", 
           // ... 
           "stats", 
           "tenet", 
          }; 

      foreach (string value in words) 
      { 
       Console.WriteLine("{0} = {1}", value, IsPalindrome(value)); 
      } 

        Console.WriteLine("\nPress any key to continue..."); 
      Console.ReadKey(true);  } 
    } 
} 

단어 배열에있는 단어가 회상인지 확인합니다 (단어는 거꾸로 동일한 전진 철자).회문 문 만들기

메인의 foreach 루프는 배열의 각 단어를 IsPalindrome() 함수로 전달합니다. 단어를 테스트하고 그에 따라 True 또는 False를 반환합니다.

현재 배열의 각 단어가 Palindrome이므로 프로그램을 실행하면 모든 현재 단어가 출력되고 True가 뒤따라야합니다. 그러나, 그것은 나에게 False를 준다. 왜 그런가요?

+4

장소 중단 점을 이동하여 코드를 통해 F10 단계를 사용하고 잘못 어디를 참조하십시오. – CodeCaster

+3

문제는 쉽게 디버깅으로 해결할 수 있습니다. 더 좋은 방법으로, 당신은 [당신의 문자열을 뒤집을 수 있습니다] (http://stackoverflow.com/questions/228038/best-way-to-reverse-a-string) 원래의 것을 비교하십시오. –

+0

왜 ToLower()를 사용하고 있습니까? – Jodrell

답변

1

max 변수를 감소시키는 것을 잊어 버린 것 같습니다.

이제 각 글자를 마지막 글자와 비교하는 것입니다.

2

max의 값을 감소 잊어 버린 것처럼

if (char.ToLower(s[min++]) != char.ToLower(s[max--])) 
       return false; 
+0

woooow..what 어리석은 오류. 건배 친구 – boy

+1

확실히, 당신은 정말 디버깅을 사용하여, 당신의 선생님이 도움을 요청해야합니다. 그리고 답을 표시하는 것을 잊지 마세요! –

3

나에게 보인다 시도; 즉, 다음

if (char.ToLower(s[min++]) != char.ToLower(s[max])) 

이 ... 아마되어야합니다 :

if (char.ToLower(s[min++]) != char.ToLower(s[max--])) 

을 어쨌든, 당신은 당신이 디버그 모드에서 그것을 통해 실행하면 꽤 빨리이 문제를 정리하고, 단계별로 할 수 있어야합니다 당신의 암호.

+0

건배 메이트, 프로그래밍 초보자 – boy

0

이미 에 대한 답변이이고 코드가 정확합니다. 다음은 더 나은 솔루션 옵션입니다 (성능 최적화가 필요 없다면) :

public static bool IsPalindrome(string s) 
{ 
    char[] array = s.ToCharArray(); 
    Array.Reverse(array); 
    string backwards = new string(array); 
    return s.Equals(backwards, StringComparison.OrdinalIgnoreCase); 
} 
+0

첫 번째와 마지막 텍스트 요소에 정확히 같은 문자가없는 경우 어떻게됩니까? – Jodrell

+0

@Jodrell - 무슨 소리 야? 우리는 문자열에 대해 이야기하고 있습니다. "아빠"는 true를 반환하고, "da"는 false를 반환합니다. 이 경우 실패한 사례를 제공해 줄 수 있습니까? –

+0

주어진 "텍스트 요소"(화면 상에 표현 된 문자)는 유니 코드 코드 포인트의 여러 조합과 그에 따른'char' 값의 다양한 조합으로 표현 될 수 있습니다. 따라서 "텍스트 요소"는 동일하게 보일 수 있고 여러 관점에서 동일하지만 일반적으로 다를 수 있습니다. 이 답변은 http://stackoverflow.com/a/26977869/659190 – Jodrell

0

최대 값을 줄여야합니다.

다른 테스트 방법.

var input = "abba"; 
var output = input.ToCharArray().Reverse().Aggregate("",(x,y) => x + y)); 
return input.Equals(output, StringComparison.OrdinalIgnoreCase); 
+0

첫 번째 및 마지막 텍스트 요소가 똑같은 문자가 있니? – Jodrell

+0

그런데 회문이 아니에요? 당신이하고 싶은 말의 예를 들어 줄 수 있습니까? – woutervs

+0

주어진 "텍스트 요소"(화면 상에 렌더링 된 문자)는 유니 코드 코드 포인트의 여러 조합과 그에 따른 char 값 조합을 나타낼 수 있습니다. 따라서 "텍스트 요소"는 동일하게 보일 수 있고 여러 관점에서 동일하지만 일반적으로 다를 수 있습니다. 이 대답은 확장 stackoverflow.com/a/26977869/659190 – Jodrell

0

여기에 당신은 당신의`while` 루프에서 더 나은 문화/소문자를 구분하지 버전,

using System.Globalization; 

bool IsPalindrome(string value, StringComparer comparer = null) 
{ 
    if (s == null) 
    { 
     throw new ArgumentNullException("value"); 
    } 

    if (comparer == null) 
    { 
     comparer = StringComparer.CurrentCultureIgnoreCase; 
    } 

    var elements = new List<string>(); 
    var m = StringInfo.GetTextElementEnumerator(value); 
    while (m.MoveNext()) 
    { 
     elements.Add(m.GetTextElement()); 
    } 

    var i = 0; 
    var j = elements.Count - 1; 
    var limit = elements.Count/2; 
    for(; i <= limit; i++, j--) 
    { 
     if (!comparer.Equals(elements[i], elements[j])) 
     { 
      return false; 
     } 
    } 

    return true; 
}