Задать вопрос
BadCats
@BadCats

Ошибка выдаваемая компилятором на олимпалном сайте?

Всем привет. На одном сайте в качестве олимпиадной задачи, ну или что то около того потребовалось написать метод проверки палиндромов
Вот самый простой алгоритм, который у меня получился
bool checkPalindrome(string inputString)
        {
            bool flag = true;
            string str = inputString;
            char[] array = str.ToCharArray(1, inputString.Length);
            if (inputString.Equals( null))
            {
                return false;
            }
            else
            {


                for (int i = 0; i < array.Length; i++)
                {
                    while (array[i] == array[i + 1])
                    {

                        if (array[i] == array[-i]) //aaaabcaaaa
                        {
                            flag = true;
                            return flag;
                        }
                        else
                        {
                            flag = false;
                            return flag;
                        }

                    }



                }
                return flag;
            }
        }

В Visual Studio - все работает нормально, но на самом сайте проверка
"падает" со следующей ошибкой:
System.Reflection.TargetInvocationE xception: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: Must be greater than the length of the string.
Parameter name: startIndex
at System.String.ToCharArray (Int32 startIndex, Int32 length) [0x00000] in :0
at testingCSharp._runigcbr.checkPalind rome (System.String inputString) [0x00000] in :0
at (wrapper managed-to-native) System.Reflection.MonoMethod:Intern alInvoke (System.Reflection.MonoMethod,objec t,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in :0
--- End of inner exception stack trace ---
at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in :0
at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in :0
at testingCSharp.TEST_0.run () [0x00000] in :0

До этого была другая ошибка но как мне подсказали у меня не было проверки условия - если строка null, теперь проверка есть, но ошибка по прежнему возникает.
Заранее спасибо!
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
tomnolane
@tomnolane
профессиональный разработчик
UPD
ОТВЕТ (правильная функция вычисления палидрома)
bool checkPalindrome(string inputString)
        {
            if (string.IsNullOrWhiteSpace(inputString))
            {
                return false;
            }
            else
            {
                char[] arr = inputString.ToCharArray();
                Array.Reverse(arr); 

                if (inputString == new string(arr))
                {
                    return true;
                }
                else
                {
                    return false;
                } 
            } 
        }

а теперь что у вас:
ca0b9f2917f44eedbb57d37e60561133.PNG
у меня тоже падает при вводе слова var h = checkPalindrome("aaaabcaaaa");
1) у вас массив str.ToCharArray(1, inputString.Length);начинается заполняется не с 0 индекса, а с 1-го!! от сюда array[0] у вас имеет значение null
2) inputString.Equals( null) <- не годно, годно так: string.IsNullOrWhiteSpace(inputString) т.к. строка может содержать пробелы (много штук) и тогда строка точно не нуллъ будет

вот так работает:
static bool checkPalindrome(string inputString)
        {
            bool flag = true;
            string str = inputString;
            char[] array = str.ToCharArray(0, inputString.Length);
            if (string.IsNullOrWhiteSpace(inputString))
            {
                return false;
            }
            else
            {


                for (int i = 0; i < array.Length; i++)
                {
                    while (array[i] == array[i + 1])
                    {

                        if (array[i] == array[-i]) //aaaabcaaaa
                        { 
                            return true;
                        }
                        else
                        { 
                            return false;
                        }

                    }



                }
                return flag;
            }
        }


3) код неверный - он не вычисляет палиндром (точнее не верно вычисляет)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы