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

本文关键字:不起作用 字符 数组 分配 新分配 | 更新日期: 2023-09-27 18:26:49

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

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;陈述

我很困惑,因为我认为在我分配result[high]=(char)replacedvalue1;之后,"result"应该是1101;。打印replacedvalue1时,我得到了预期的"1"。然而,逐行调试显示,"1001"在结尾变成了"11",表示奇怪的字符。

可能出了什么问题?

感谢

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

字符和数字不是一回事。我发现在做这种事情时,保持ASCII图表打开是最容易的。如果你查看其中一个图表,你会发现字符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)是很好的工具。

你不需要写那么多代码就可以做到这一点。

这是你的回文法;

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));
  }