2015-12-14 2 views
0

У меня возникают проблемы с переопределением значения в массив символов. Ниже мой код (незаконченный решение, чтобы найти следующий наименьший палиндром):Переназначение значения массиву символов не работает

public int nextSmallestPalindrome(int number) 
    { 
     string numberString = number.ToString(); 

     // Case 1: Palindrome is all 9s 
     for (int i = 0; i < numberString.Length; i++) 
     { 
      if (numberString[i] != '9') 
      { 
       break; 
      } 
      int result = number + 2; 
      return result; 
     } 

     // Case 2: Is a palindrome 
     int high = numberString.Length - 1; 
     int low = 0; 
     bool isPalindrome = true; 
     for (low = 0; low <= high; low++, high--) 
     { 
      if (numberString[low] != numberString[high]) 
      { 
       isPalindrome = false; 
       break; 
      } 
     } 

     char[] array = numberString.ToCharArray(); 
     if (isPalindrome == true) 
     { 
      // While the middle character is 9 
      while (numberString[high] == '9' || numberString[low] == '9') 
      { 
       array[high] = '0'; 
       array[low] = '0'; 
       high++; 
       low--; 
      } 
      int replacedvalue1 = (int)Char.GetNumericValue(numberString[high]) + 1; 
      int replacedvalue2 = (int)Char.GetNumericValue(numberString[low]) + 1; 
      StringBuilder result = new StringBuilder(new string(array)); 
      if (high == low) 
      { 
       result[high] = (char)replacedvalue1; 
      } 
      else 
      { 
       Console.WriteLine(result.ToString()); 
       result[high] = (char)replacedvalue1; 
       Console.WriteLine(result.ToString()); 
       result[low] = (char)replacedvalue2; 
      } 


      return Int32.Parse(result.ToString()); 
     } 
     else return -1; 

    } 

Основные трассы класса:

Console.WriteLine(nextSmallestPalindrome(1001)); 

Это возвращает 1001, затем 101, а затем дает FormatException при возвращении Int32.Parse (result.ToString()); заявление.

Я очень смущен, так как я считаю, что «результат» должен быть 1101 после того, как я назначу результат [высокий] = (char) replacevalue1 ;. Печать replacevalue1 дает мне «1», как ожидалось. Тем не менее, отладка строки по строке показывает, что «1001» в конце превращается в «1 1», что означает странные символы.

Что может быть не так?

Thanks

+0

Это лучше всего решить с помощью отладчика. Пожалуйста, отлаживайте его. – Jagannath

+0

Я не понимаю ваш алгоритм. Вы можете это описать? Что такое высокое, низкое? Почему вы вообще что-то заменяете? Какой результат вы ожидаете? Покажите несколько примеров. –

+0

Пока мой алгоритм проверяет первый случай, если строка - это все 9s; в этом случае следующий самый высокий палиндром равен 1x1, где x = соответствующее число 0s. Второй случай: если строка уже является палиндром; чтобы найти следующий самый высокий номер палиндрома, я делаю высокий и низкий индекс первых чисел, которые НЕ являются 9; примером этого будет 191 или 1991 год. Я меняю все 9s на 0s, и я хочу добавить 1 к следующему номеру с высоким и низким индексом. Например, это изменит значение с 191 по 202 или с 1991 по 2002 год. В случае моего теста 1001 должно измениться на 1111, где индексы: 1 и 2. –

ответ

3

Персонажи и цифры - это не одно и то же. Я считаю, что проще всего открывать ASCII chart при выполнении такого рода вещей. Если вы посмотрите на один из этих графиков, вы увидите, что характер 0 на самом деле имеет десятичное значение 48.

char c = (char)48; // Equals the character '0' 

Обратное также верно:

char c = '0'; 
int i = (int)c; // Equals the number 48 

Вам удалось держать char с и int s отдельно для большей части, но в конце концов вы получили путаете:

// Char.GetNumericValue('0') will return the number 0 
// so now replacedvalue1 will equal 1 
int replacedvalue1 = (int)Char.GetNumericValue(numberString[high]) + 1; 
// You are casting the number 1 to a character, which according to the 
// ASCII chart is the (unprintable) character SOH (start of heading) 
result[high] = (char)replacedvalue1; 

FYI вам действительно не нужно бросать символ назад и вперед, чтобы выполнять операции над ним. char c = 'a'; c++; действителен и будет равен следующему символу таблицы ('b'). Точно так же вы можете увеличивать числовые символы: char c = '0'; c++; // c now equals '1'

Edit: Самый простой способ превратить целое число 1 в символ «1», чтобы «добавить» целое число в символ «0»:

result[high] = (char)('0' + replacedvalue1); 

Конечно, есть намного более простые способы выполнить то, что вы пытаетесь сделать, но эти методы (конвертирование и добавление char s и int s) являются хорошими инструментами для ознакомления.

+0

Хм, я боялся этого; это имеет смысл. Благодаря! –

+0

Я обновил ответ, чтобы показать вам, как преобразовать целое число в символ. Если бы этот ответ помог вам, проголосуйте. Если она решит вашу проблему, отметьте ее как правильный ответ. – Ian

+0

Еще одна вещь, будьте осторожны с диапазонами. Если вы прочитали номер 9, добавьте 1, у вас есть 10. Добавьте 10 в '0', и вы получите символ ':', который также не сможет проанализировать. – Ian

0

У вас нет большого кода для этого.

Это ваш метод IsPalindrome;

private static bool IsPalindrome(int n) 
{ 
    string ns = n.ToString(CultureInfo.InvariantCulture); 
    var reversed = string.Join("", ns.Reverse()); 
    return (ns == reversed); 
} 

private static int FindTheNextSmallestPalindrome(int x) 
{ 
    for (int i = x; i < 2147483647; i++) 
    { 
     if (IsPalindrome(i)) 
     { 
      return i; 
     } 
    } 
    throw new Exception("Number must be less than 2147483647"); 
} 

Как вы это называете. Вам не нужен массив для его вызова. Вы можете просто ввести любое число, которое меньше 2147483647 (максимальное значение int) и получить следующее значение палиндрома.

var mynumbers = new[] {10, 101, 120, 110, 1001}; 
    foreach (var mynumber in mynumbers) 
    { 
     Console.WriteLine(FindTheNextPalindrome(mynumber)); 
    } 
+0

Это, вероятно, хорошее решение для другой проблемы, но метод OP имеет эту подпись: 'int nextSmallestPalindrome (int number)'. – Enigmativity

+0

Причина для downvote? –

+0

@ Энигматичность: Вы хотели сказать, что ОП пытается вызвать метод, не зная, какие числа должны использоваться? –