こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです!
私のコラム「DailyBlueBridge」に注目してください。このコラムの主な機能は、近年のBlue Bridge Cupの地方大会と決勝戦の実際の質問を共有し、アルゴリズムのアイデア、データ構造、およびあなたが学ぶのを助けるためにそこに存在する他のコンテンツより多くの知識と技術に!
タイトル:手紙を推測する
19文字のabcd ... sで構成されるシーケンスを106回繰り返しスプライスして、2014年の長さの文字列を取得します。
次に、最初の文字(つまり、最初の文字a)と、3番目、5番目、およびすべての奇数の文字を削除します。
新しい文字列を取得したら、奇数の文字を削除するなどの操作を行ってください。残りの文字は1文字だけです。文字を書き込んでください。
回答は小文字です。ブラウザから回答を送信してください。余分なコンテンツは入力しないでください。
問題解決のアイデア:
質問の意味によると、質問の要件は長さ2014の文字列の奇数桁を削除することであり、最終的には1文字だけが残り、その文字を見つけるプロセスがあります。多くの人が最初にそのような質問を見つけたとき。1つの考えは、リストの形式を使用して、2014年の長さのこの文字列を格納することです。このように、removeメソッドを使用して奇数桁の文字を削除できます。ループは文字が1つだけ残るまで続きます。この方法は実行可能と思われますが、実際の操作ではそうではないことがわかります。理由は、removeメソッドを使用して文字を削除するたびに、長さがリストの1つが減るので、次のリストを削除すると、削除された場所は前の奇数ではなくなります。これは、文字列の長さと奇数の文字がループを通過するたびに固定されることを保証するものではありません。 。
したがって、このことを考えると、代わりに配列を使用できます。配列は奇数桁の文字を直接削除することはできませんが、偶数桁の文字を前方に移動し、最後にすべての偶数を前に移動することができます。 k個の偶数文字を移動するとき、次の移動では、配列の最初のkビットを新しい配列として使用し、最初のステップの操作を繰り返すことができます。最後のk = 1まで、つまり、偶数の数字が1つだけ配列内で移動されると、偶数の数字の文字が最終的な答えは文字qになります。
回答のソースコード:
public class Year2014_Bt3 { public static void main(String[] args) { char[] c = new char[2014]; //存放所有的字母 int index = 0; //标记数组中元素下标 //循环106次,将前19个字母存放到数组中 for (int i = 1; i <= 106; i++) { for (int j = 0; j < 19; j++) { c[index++] = (char) ('a' + j); } } int len = 2014; //当有效数组长度不是1时,让偶数位前移 while (len!=1) { int k=0; //将偶数位从0开始向后赋给数组 for (int i = 1; i < len; i+=2) { c[k++] = c[i]; } len = k; //记录每次剩余的偶数位,也是下一次有效数组的长度 } System.out.println(c[0]); } }
サンプル出力: