将值重新分配给不起作用的字符数组

时间:2015-12-14 03:50:55

标签: c# arrays

我目前在将值重新分配给字符数组时遇到问题。下面是我的代码(未完成的解决方案,以找到下一个最小的回文):

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,然后在返回Int32.Parse(result.ToString())时给出一个formatexception;声明。

我很困惑,因为我认为在分配结果[high] =(char)replacementvalue1;后,“result”应该是1101。打印replacementvalue1按预期给出“1”。但是,逐行调试显示“1001”在结尾处变为“1 1”,表示奇怪的字符。

可能出现什么问题?

由于

2 个答案:

答案 0 :(得分:3)

字符和数字不是一回事。我发现在做这类事情时保持ASCII chart开放最容易。 如果您查看其中一个图表,您会看到字符 0的实际小数值为48。

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

反过来也是如此:

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

大部分时间你设法将charint分开,但最后却让他们混淆了:

// 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;

仅供参考,您实际上不需要来回投射字符以便对其执行操作。 char c = 'a'; c++;有效,并且等于表格中的下一个字符('b')。同样,您可以增加数字字符: char c = '0'; c++; // c now equals '1'

编辑:将整数1转换为字符“1”的最简单方法是将整数“加”到字符“0”:

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

当然,有更简单的方法可以实现您的目标,但这些技术(转换和添加charint)是很好的工具。

答案 1 :(得分: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));
  }