订购一个字符数组,使所有的元音出现在最后
本文关键字:最后 数组 字符 一个 | 更新日期: 2023-09-27 17:51:08
我试图写一个程序,其中一个单词作为字符串作为输入提供,我必须重新排列单词,这样它只是通过移动来改变单词中字母的顺序所有的元音直到最后,保持它们在原单词
中的顺序相同。namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string word = "application";
char[] letters = word.ToCharArray();
char x = new char { };
for (int j = 0; j < letters.Length; j++)
{
if ((letters[j] == 'a') | (letters[j] == 'e' ) | (letters[j] == 'i' ) | (letters[j] == 'o' ) | (letters[j]
== 'u'))
{
for (int i = 0; i < letters.Length - 1; i++)
{
x = letters[i];
letters[i] = letters[i + 1];
letters[i + 1] = x;
}
}
}
string s = new string(letters);
Console.WriteLine(s);
}
}
}
程序的输出是
ationaplic
但是程序的预期输出是
pplctnaiaio
为什么我的代码没有产生我想要的输出?
编辑后的工作代码为
namespace VowelSort
{
class Program
{
static void Main(string[] args)
{
string word = "application";
char[] letters = word.ToCharArray();
char x = new char { };
int count = 0;
for (int j = 0; j < letters.Length - count; j++)
{
if ((letters[j] == 'a') | (letters[j] == 'e') | (letters[j] == 'i') | (letters[j] == 'o') | (letters[j] == 'u') | (letters[j] == 'A') | (letters[j] == 'E') | (letters[j] == 'I') | (letters[j] == 'O') | (letters[j] == 'U'))
{
for (int i = j; i < letters.Length - 1; i++)
{
x = letters[i];
letters[i] = letters[i + 1];
letters[i + 1] = x;
}
count++;
j--;
}
}
string s = new string(letters);
Console.WriteLine(s);
Console.WriteLine(count);
}
}
}
我在这里发现了三个问题:
- 当你找到一个元音时,你从
0
开始你的内循环,所以你总是把第一个字符移到末尾。改为从j
启动。 - 在你移动了一个元音之后,你从下一个字母开始你的外循环——所以如果你有两个元音在一排,你跳过第二个(因为它被移动到"当前"位置的后面)。移动完一个元音后,减少
j
。 - 你的外循环一直运行到最后,但是当你已经移动到元音时,你应该停止它。计算你移动的元音的数量,当你从末尾到达那么多字符时,停止外循环。
试着自己实现这些改变,但如果你卡住了,我可以给你一些建议。
一旦你有了这个工作,你可能会想要加速你的内部循环,意识到你不需要执行多个配对交换-你可以只注意你找到的元音,将它之后的所有内容移动一个字符,然后在末尾插入元音。
有
static char[] vowels = new char[] { 'a', 'e', 'i', 'o', 'u' };
使用这个LINQ查询:
string s = "absdiuoc";
string result = string.Concat(s.ToCharArray()
.GroupBy(c => vowels.Contains(c))
.OrderBy(g => g.Key)
.SelectMany(g => g));
使用一个简单的LINQ查询:
word = String.Concat(word.OrderBy(c => "aeiou".Contains(c)));
当您的代码识别一个元音时,它将其移动到数组的末尾(从而将所有字母向左移动一个空格)。然而,你的外部循环仍然移动到下一个字符,这意味着如果有连续的元音,你会错过一个元音:
例如,考虑单词"air"。当变量i
为0时,将"a"移到末尾:
air
^ i=0
i
被增加到1,现在在索引0处缺少'i':
ira
^ i=1
(您还需要确保外部循环在到达已经移动的元音之前停止)