反转具有约束要求的字符串
Reversing a string with constrained requirements
我刚开始学习 C#,需要一些帮助。我必须反转字符串并仅使用 if
、else
、switch
、s.Length
、s.Substring
和 s[]
:[= 检查回文18=]
static string MyReverseString(string s)
{
int len = s.Length;
string NewS= "";
if (len != 0)
{
NewS = NewS + s[len];
return MyReverseString(s.Substring(0, (len - 1)));
}
else
{
return NewS;
}
}
我得到
"Index was outside the bounds of the array."
你的大体思路是对的,但你还差得远。
使用递归时,先编写不需要递归的情况。反转字符串时,什么是简单的情况?那么,当字符串为空或只有一个字符长时。好的,让我们开始吧:
public static string Reverse(string s)
{
if (s.Length <= 1)
return s;
//do something else
}
好的,现在,如果 s
不为空,我们如何递归反转?好吧,让我们考虑一下当前步骤中应该return编辑什么。显然,如果我们要反转s
,不管我们return,我们知道第一个字母需要是s
的最后一个字母。好的,让我们开始吧,看看它会带我们去哪里:
public static string Reverse(string s)
{
if (s.Length <= 1)
return s;
return s[s.Length - 1] + //something
}
那个东西是什么?好吧,它必须是没有最后一个字母的 s
的反面,我们已经处理了那个,记得吗?但是……哦等等!我已经知道如何反转字符串了,不是吗? Reverse(s.Substring(0, s.Length - 1)
(递归是不是很神奇?)
中提琴:
public static string Reverse(string s)
{
if (s.Length <= 1)
return s;
return s[s.Length - 1] + Reverse(s.Substring(0, s.Length - 1));
}
您甚至不需要 switch
和 else
。
此处,s[len] 抛出 IndexOutOfRange 异常。比方说 - 如果你有字符串 s = "abc" 那么索引从 0 开始。所以 s[2] 将是 "c" 并且字符串的长度是 3。所以,如果你尝试获取 s[len]即s[3],会抛出异常
看看 -
Best way to reverse a string
要反转字符串,请将其切成两半,交换两半并以这种方式递归反转它们,直到它们的大小为 1 或 0 个字符。
要检查回文,您需要检查第一个字符和最后一个字符是否相同。如果不是这样,则该字符串绝对不是回文。如果为真,则以相同的方式递归检查原始字符串的较小部分(除了第一个和最后一个字符)是否为回文。
static string Reverse(string s)
{
if (s.Length >= 2)
return Reverse(s.Substring(s.Length / 2)) + Reverse(s.Substring(0, s.Length / 2));
else
return s;
}
static bool IsPalindrome(string s)
{
if (s.Length <= 1)
return true;
if (s[0] == s[s.Length - 1] && IsPalindrome(s.Substring(1, s.Length-2)))
return true;
else
return false;
}
试试这个:
public static string MyReverseString(string s)
{
return MyReverseString(s, s.Length - 1);
}
private static string MyReverseString(string s, int index)
{
if (index > 0)
{
return s[index] + MyReverseString(s, index - 1);
}
else
{
return s[index].ToString();
}
}
这样就避免了使用.Substring
(稍微提高了效率)。
如果你想找到一个回文并且你不关心反转字符串,那么试试这个:
public static bool IsPalindrome(string s)
{
return IsPalindrome(s, 0, s.Length - 1);
}
private static bool IsPalindrome(string s, int start, int finish)
{
if (finish - start <= 0)
{
return true;
}
else
{
if (s[start] != s[finish])
{
return false;
}
else
{
return IsPalindrome(s, start + 1, finish - 1);
}
}
}
这个最终方法可以缩短为:
private static bool IsPalindrome(string s, int start, int finish)
{
return (finish - start <= 0) || (s[start] == s[finish]) && IsPalindrome(s, start + 1, finish - 1);
}
我刚开始学习 C#,需要一些帮助。我必须反转字符串并仅使用 if
、else
、switch
、s.Length
、s.Substring
和 s[]
:[= 检查回文18=]
static string MyReverseString(string s)
{
int len = s.Length;
string NewS= "";
if (len != 0)
{
NewS = NewS + s[len];
return MyReverseString(s.Substring(0, (len - 1)));
}
else
{
return NewS;
}
}
我得到
"Index was outside the bounds of the array."
你的大体思路是对的,但你还差得远。
使用递归时,先编写不需要递归的情况。反转字符串时,什么是简单的情况?那么,当字符串为空或只有一个字符长时。好的,让我们开始吧:
public static string Reverse(string s)
{
if (s.Length <= 1)
return s;
//do something else
}
好的,现在,如果 s
不为空,我们如何递归反转?好吧,让我们考虑一下当前步骤中应该return编辑什么。显然,如果我们要反转s
,不管我们return,我们知道第一个字母需要是s
的最后一个字母。好的,让我们开始吧,看看它会带我们去哪里:
public static string Reverse(string s)
{
if (s.Length <= 1)
return s;
return s[s.Length - 1] + //something
}
那个东西是什么?好吧,它必须是没有最后一个字母的 s
的反面,我们已经处理了那个,记得吗?但是……哦等等!我已经知道如何反转字符串了,不是吗? Reverse(s.Substring(0, s.Length - 1)
(递归是不是很神奇?)
中提琴:
public static string Reverse(string s)
{
if (s.Length <= 1)
return s;
return s[s.Length - 1] + Reverse(s.Substring(0, s.Length - 1));
}
您甚至不需要 switch
和 else
。
此处,s[len] 抛出 IndexOutOfRange 异常。比方说 - 如果你有字符串 s = "abc" 那么索引从 0 开始。所以 s[2] 将是 "c" 并且字符串的长度是 3。所以,如果你尝试获取 s[len]即s[3],会抛出异常
看看 - Best way to reverse a string
要反转字符串,请将其切成两半,交换两半并以这种方式递归反转它们,直到它们的大小为 1 或 0 个字符。
要检查回文,您需要检查第一个字符和最后一个字符是否相同。如果不是这样,则该字符串绝对不是回文。如果为真,则以相同的方式递归检查原始字符串的较小部分(除了第一个和最后一个字符)是否为回文。
static string Reverse(string s)
{
if (s.Length >= 2)
return Reverse(s.Substring(s.Length / 2)) + Reverse(s.Substring(0, s.Length / 2));
else
return s;
}
static bool IsPalindrome(string s)
{
if (s.Length <= 1)
return true;
if (s[0] == s[s.Length - 1] && IsPalindrome(s.Substring(1, s.Length-2)))
return true;
else
return false;
}
试试这个:
public static string MyReverseString(string s)
{
return MyReverseString(s, s.Length - 1);
}
private static string MyReverseString(string s, int index)
{
if (index > 0)
{
return s[index] + MyReverseString(s, index - 1);
}
else
{
return s[index].ToString();
}
}
这样就避免了使用.Substring
(稍微提高了效率)。
如果你想找到一个回文并且你不关心反转字符串,那么试试这个:
public static bool IsPalindrome(string s)
{
return IsPalindrome(s, 0, s.Length - 1);
}
private static bool IsPalindrome(string s, int start, int finish)
{
if (finish - start <= 0)
{
return true;
}
else
{
if (s[start] != s[finish])
{
return false;
}
else
{
return IsPalindrome(s, start + 1, finish - 1);
}
}
}
这个最终方法可以缩短为:
private static bool IsPalindrome(string s, int start, int finish)
{
return (finish - start <= 0) || (s[start] == s[finish]) && IsPalindrome(s, start + 1, finish - 1);
}