3

文字列としての単語が入力として提供されるプログラムを作成しようとしていますが、すべての母音を最後に移動して、単語の文字の順序を変更するように単語を再配置する必要があります。元の単語に表示されたのと同じ順序でそれらを

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

4 に答える 4

6

私がここで見つけた3つの問題があります:

  1. 母音を見つけたら、内側のループをで開始する0ので、常に最初の文字を最後に移動します。j代わりにで開始してください。
  2. 母音を移動した後、次の文字から外側のループを開始します。つまり、2つの母音が連続している場合は、2番目の母音をスキップします(「現在の」位置の後ろに移動したため)。母音の移動をやり直し、デクリメントしますj
  3. 外側のループを最後まで実行しますが、すでに移動した母音に到達したら停止する必要があります。移動した母音の数を数え、最後からその数の文字に到達したら、外側のループを停止します。

これらの変更を自分で実装してみてください。ただし、行き詰まった場合は、いくつかの指針を示します。

これが機能したら、複数のペアワイズスワップを実行する必要がないことを認識して、内側のループを高速化することができます。見つけた母音をメモし、その後のすべてを1文字上に移動して、挿入するだけです。最後の母音。

于 2013-01-09T08:44:38.803 に答える
3

持っている

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));
于 2013-01-09T08:39:58.687 に答える
2

単純なLINQクエリを使用します。

word = String.Concat(word.OrderBy(c => "aeiou".Contains(c)));
于 2013-01-09T08:41:37.837 に答える
1

コードが母音を識別すると、それを配列の最後に移動します(したがって、すべての文字を1スペース左に移動します)。ただし、外側のループはまだ次の文字に移動しています。つまり、連続する母音がある場合、母音を見逃すことになります。

たとえば、「空気」という単語を考えてみましょう。変数iが0の場合、「a」は最後に移動します。

air
^ i=0

iインデックス0で「i」が欠落している1にインクリメントされます。

ira
 ^ i=1

(また、すでに移動された母音に到達する前に、外側のループが停止していることを確認する必要があります。)

于 2013-01-09T08:45:38.030 に答える