将值重新分配给不起作用的字符数组
本文关键字:不起作用 字符 数组 分配 新分配 | 更新日期: 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
在大多数情况下,你设法将char
和int
分开,但最终你把它们搞混了:
// 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);
当然,有更简单的方法来完成您想要做的事情,但这些技术(转换和添加char
和int
)是很好的工具。
你不需要写那么多代码就可以做到这一点。
这是你的回文法;
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));
}