在 C# 中反转字符串中的元音
Reverse Vowels in a String in C#
我正在尝试将一个字符串作为输入,return 仅将元音反转的字符串。它没有错误,但没有错误。它在 Test19() 和 Test20 上失败。 运行 不知道如何解决这个问题或者为什么我在这个测试中遇到问题。所有其他测试通过。第一个代码块是我的代码,然后是我在第二个块中创建的测试。
这是 link 页面,其中详细介绍了我所做测试的更多信息。
Nunit.org StringAssert (NUnit 2.2.3)
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Vowels
{
public class reverseVowels
{
public static bool IsVowel(char c)
{
char[] vowels = new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
return vowels.Any(ch => ch == c);
}
public static string reverseVowelsOfString(string s)
{
List<char> list = (from char c in s
where IsVowel(c)
select c).ToList();
StringBuilder sb = new StringBuilder();
foreach (char v in s)
{
if (IsVowel(v))
{
sb.Append(list.Last());
list.Remove(list.Last());
}
else
{
sb.Append(v);
}
}
return sb.ToString();
}
}
}
using NUnit.Framework;
namespace Vowels
{
public class VowelsTest
{
[Test]
public void Test1() => StringAssert.Contains("hollo, werld", reverseVowels.reverseVowelsOfString("hello, world"));
[Test]
public void Test2() => StringAssert.Contains("cadisegnol", reverseVowels.reverseVowelsOfString("codesignal"));
[Test]
public void Test3() => StringAssert.Contains("UOaIye", reverseVowels.reverseVowelsOfString("eIaOyU"));
[Test]
public void Test4() => StringAssert.Contains("", reverseVowels.reverseVowelsOfString(""));
[Test]
public void Test5() => StringAssert.Contains(" ", reverseVowels.reverseVowelsOfString(" "));
[Test]
public void Test6() => StringAssert.Contains(".a", reverseVowels.reverseVowelsOfString(".a"));
[Test]
public void Test7() => StringAssert.Contains("ia", reverseVowels.reverseVowelsOfString("ai"));
[Test]
public void Test8() => StringAssert.Contains("Aa", reverseVowels.reverseVowelsOfString("aA"));
[Test]
public void Test9() => StringAssert.Contains(".,", reverseVowels.reverseVowelsOfString(".,"));
[Test]
public void Test10() => StringAssert.Contains("ab", reverseVowels.reverseVowelsOfString("ab"));
[Test]
public void Test11() => StringAssert.Contains("0P", reverseVowels.reverseVowelsOfString("0P"));
[Test]
public void Test12() => StringAssert.Contains("!!!", reverseVowels.reverseVowelsOfString("!!!"));
[Test]
public void Test13() => StringAssert.Contains("a a", reverseVowels.reverseVowelsOfString("a a"));
[Test]
public void Test14() => StringAssert.Contains("abb", reverseVowels.reverseVowelsOfString("abb"));
[Test]
public void Test15() => StringAssert.Contains("1b1", reverseVowels.reverseVowelsOfString("1b1"));
[Test]
public void Test16() => StringAssert.Contains("abba", reverseVowels.reverseVowelsOfString("abba"));
[Test]
public void Test17() => StringAssert.Contains("c#dc", reverseVowels.reverseVowelsOfString("c#dc"));
[Test]
public void Test18() => StringAssert.Contains("......a.....", reverseVowels.reverseVowelsOfString("......a....."));
[Test]
public void Test19() => StringAssert.Contains("raca e car", reverseVowels.reverseVowelsOfString("race a car"));
[Test]
public void Test20() => StringAssert.Contains("SorE was I ere I saw eros.", reverseVowels.reverseVowelsOfString("Sore was I ere I saw Eros."));
[Test]
public void Test21() => StringAssert.Contains("a man, a plan, a canal -- PanamA", reverseVowels.reverseVowelsOfString("A man, a plan, a canal -- Panama"));
}
}
X Test19 [43ms]
Error Message:
Expected: String containing "raca e car"
But was: "raca a cer"
Stack Trace:
at Vowels.VowelsTest.Test19() in C:\Users\scott\Desktop\reverseVowelsOfString\test.cs:line 62
X Test20 [< 1ms]
Error Message:
Expected: String containing "SorE was I ere I saw eros."
But was: "Soro wEs a arI I sew eres."
Stack Trace:
at Vowels.VowelsTest.Test20() in C:\Users\scott\Desktop\reverseVowelsOfString\test.cs:line 65
Test Run Failed.
Total tests: 21
Passed: 19
Failed: 2
Total time: 1.1547 Seconds
发生这种情况是因为在测试用例 19 中;
list = { 'a', 'e', 'a', 'a' }
并且当您尝试删除 list.Last() 即 'a' 时,第一个元素将被删除。
sb.Append(list.Last()); // appends the last element in the list, which is OK,
list.Remove(list.Last()); // since list.Last() is 'a', removes the first 'a' element in the list.
解决方法很简单:
sb.Append(list.Last());
list.RemoveAt(list.Count - 1); // Remove the last item in the list.
希望对您有所帮助。
我会做一些改变。首先,我会将元音列表的创建移动到一次性分配的 class 成员中,以避免不必要的分配。出于效率原因,我还将其设为 HashSet<char>
:
private static readonly HashSet<char> _vowels = new HashSet<char>(new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' });
现在您的 IsVowel()
方法可以简化为:
public static bool IsVowel(char c) => _vowels.Contains(c);
对于完成所有工作的方法,我会给变量更有意义的名称。 vowels
而不是 list
和 c
而不是 v
因为我们知道它是一个字符,但不一定是元音(我假设这就是 v
的意思对于).
我还会将元音列表放在 Stack<char>
中,以便您可以根据需要轻松弹出它们。
public static string reverseVowelsOfString(string s)
{
Stack<char> vowels = new Stack<char>(s.Where(IsVowel));
StringBuilder sb = new StringBuilder();
foreach (char c in s)
{
if (IsVowel(c))
{
sb.Append(vowels.Pop());
}
else
{
sb.Append(c);
}
}
return sb.ToString();
}
我正在尝试将一个字符串作为输入,return 仅将元音反转的字符串。它没有错误,但没有错误。它在 Test19() 和 Test20 上失败。 运行 不知道如何解决这个问题或者为什么我在这个测试中遇到问题。所有其他测试通过。第一个代码块是我的代码,然后是我在第二个块中创建的测试。
这是 link 页面,其中详细介绍了我所做测试的更多信息。 Nunit.org StringAssert (NUnit 2.2.3)
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Vowels
{
public class reverseVowels
{
public static bool IsVowel(char c)
{
char[] vowels = new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
return vowels.Any(ch => ch == c);
}
public static string reverseVowelsOfString(string s)
{
List<char> list = (from char c in s
where IsVowel(c)
select c).ToList();
StringBuilder sb = new StringBuilder();
foreach (char v in s)
{
if (IsVowel(v))
{
sb.Append(list.Last());
list.Remove(list.Last());
}
else
{
sb.Append(v);
}
}
return sb.ToString();
}
}
}
using NUnit.Framework;
namespace Vowels
{
public class VowelsTest
{
[Test]
public void Test1() => StringAssert.Contains("hollo, werld", reverseVowels.reverseVowelsOfString("hello, world"));
[Test]
public void Test2() => StringAssert.Contains("cadisegnol", reverseVowels.reverseVowelsOfString("codesignal"));
[Test]
public void Test3() => StringAssert.Contains("UOaIye", reverseVowels.reverseVowelsOfString("eIaOyU"));
[Test]
public void Test4() => StringAssert.Contains("", reverseVowels.reverseVowelsOfString(""));
[Test]
public void Test5() => StringAssert.Contains(" ", reverseVowels.reverseVowelsOfString(" "));
[Test]
public void Test6() => StringAssert.Contains(".a", reverseVowels.reverseVowelsOfString(".a"));
[Test]
public void Test7() => StringAssert.Contains("ia", reverseVowels.reverseVowelsOfString("ai"));
[Test]
public void Test8() => StringAssert.Contains("Aa", reverseVowels.reverseVowelsOfString("aA"));
[Test]
public void Test9() => StringAssert.Contains(".,", reverseVowels.reverseVowelsOfString(".,"));
[Test]
public void Test10() => StringAssert.Contains("ab", reverseVowels.reverseVowelsOfString("ab"));
[Test]
public void Test11() => StringAssert.Contains("0P", reverseVowels.reverseVowelsOfString("0P"));
[Test]
public void Test12() => StringAssert.Contains("!!!", reverseVowels.reverseVowelsOfString("!!!"));
[Test]
public void Test13() => StringAssert.Contains("a a", reverseVowels.reverseVowelsOfString("a a"));
[Test]
public void Test14() => StringAssert.Contains("abb", reverseVowels.reverseVowelsOfString("abb"));
[Test]
public void Test15() => StringAssert.Contains("1b1", reverseVowels.reverseVowelsOfString("1b1"));
[Test]
public void Test16() => StringAssert.Contains("abba", reverseVowels.reverseVowelsOfString("abba"));
[Test]
public void Test17() => StringAssert.Contains("c#dc", reverseVowels.reverseVowelsOfString("c#dc"));
[Test]
public void Test18() => StringAssert.Contains("......a.....", reverseVowels.reverseVowelsOfString("......a....."));
[Test]
public void Test19() => StringAssert.Contains("raca e car", reverseVowels.reverseVowelsOfString("race a car"));
[Test]
public void Test20() => StringAssert.Contains("SorE was I ere I saw eros.", reverseVowels.reverseVowelsOfString("Sore was I ere I saw Eros."));
[Test]
public void Test21() => StringAssert.Contains("a man, a plan, a canal -- PanamA", reverseVowels.reverseVowelsOfString("A man, a plan, a canal -- Panama"));
}
}
X Test19 [43ms]
Error Message:
Expected: String containing "raca e car"
But was: "raca a cer"
Stack Trace:
at Vowels.VowelsTest.Test19() in C:\Users\scott\Desktop\reverseVowelsOfString\test.cs:line 62
X Test20 [< 1ms]
Error Message:
Expected: String containing "SorE was I ere I saw eros."
But was: "Soro wEs a arI I sew eres."
Stack Trace:
at Vowels.VowelsTest.Test20() in C:\Users\scott\Desktop\reverseVowelsOfString\test.cs:line 65
Test Run Failed.
Total tests: 21
Passed: 19
Failed: 2
Total time: 1.1547 Seconds
发生这种情况是因为在测试用例 19 中;
list = { 'a', 'e', 'a', 'a' }
并且当您尝试删除 list.Last() 即 'a' 时,第一个元素将被删除。
sb.Append(list.Last()); // appends the last element in the list, which is OK,
list.Remove(list.Last()); // since list.Last() is 'a', removes the first 'a' element in the list.
解决方法很简单:
sb.Append(list.Last());
list.RemoveAt(list.Count - 1); // Remove the last item in the list.
希望对您有所帮助。
我会做一些改变。首先,我会将元音列表的创建移动到一次性分配的 class 成员中,以避免不必要的分配。出于效率原因,我还将其设为 HashSet<char>
:
private static readonly HashSet<char> _vowels = new HashSet<char>(new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' });
现在您的 IsVowel()
方法可以简化为:
public static bool IsVowel(char c) => _vowels.Contains(c);
对于完成所有工作的方法,我会给变量更有意义的名称。 vowels
而不是 list
和 c
而不是 v
因为我们知道它是一个字符,但不一定是元音(我假设这就是 v
的意思对于).
我还会将元音列表放在 Stack<char>
中,以便您可以根据需要轻松弹出它们。
public static string reverseVowelsOfString(string s)
{
Stack<char> vowels = new Stack<char>(s.Where(IsVowel));
StringBuilder sb = new StringBuilder();
foreach (char c in s)
{
if (IsVowel(c))
{
sb.Append(vowels.Pop());
}
else
{
sb.Append(c);
}
}
return sb.ToString();
}