私はCodilityについていくつかの課題を試してみたかったのですが、始めから始めました。すべての割り当ては、MaxCountersと呼ばれるものまで比較的簡単でした。私はこれが特に難しいとは思わないが、最初は痛みがないとマークされている。MaxCounters codilityの理解
私はtaskを読み、C#言語でコーディングし始めている:もちろんの3つのループを持つ
public static int[] maxPart(int N, int[] A){
int[] counters = new int[N];
for(int i = 0; i < A.Length; i++){
for(int j = 0; j < counters.Length; j++){
if(A[i] == counters[j] && (counters[j] >= 1 && counters[j] <= N)){
counters [j] = counters [j] + 1;
}
if(A[i] == N + 1){
int tmpMax = counters.Max();
for(int h = 0; h < counters.Length; h++){
counters [h] = tmpMax;
}
}
}
}
return counters;
}
はそれが本当に遅くなりますが、後でそれを残すことができます。私の懸念は、このようにこのことを理解し、他のすべての人々がこの質問で好きに見える方法です。here。
割り当ての説明から。
それは2つのアクションがあります
- 増加(X) - カウンタXは、1だけ増加
- 最大カウンタである - すべてのカウンタは、任意 カウンタの最大値に設定されています。条件下で起こる
:
- もしそのような[K] = X、その1≤X≤N、動作Kが増加である(X)、
- なら[K] = N + 1ならば、演算Kは最大カウンタである。
上記のコードには両方の条件が記載されています。うっかり間違っていますが、私は混乱しています。どうやって違うのか分かりません。
なぜこのコードが間違っているのですか。タスクの説明には何が欠けていますか?
トップクラスの答えの一つは、次のようになります。
public int[] solution(int N, int[] A) {
int[] result = new int[N];
int maximum = 0;
int resetLimit = 0;
for (int K = 0; K < A.Length; K++)
{
if (A[K] < 1 || A[K] > N + 1)
throw new InvalidOperationException();
if (A[K] >= 1 && A[K] <= N)
{
if (result[A[K] - 1] < resetLimit) {
result[A[K] - 1] = resetLimit + 1;
} else {
result[A[K] - 1]++;
}
if (result[A[K] - 1] > maximum)
{
maximum = result[A[K] - 1];
}
}
else
{
// inefficiency here
//for (int i = 0; i < result.Length; i++)
// result[i] = maximum;
resetLimit = maximum;
}
}
for (int i = 0; i < result.Length; i++)
result[i] = Math.max(resetLimit, result[i]);
return result;
}
このコードはCodility 100%となります。
質問:
私は著者がresult[A[K] - 1]
を使用するタスクから知っていたか知りたいのですが? resetLimit
は何を表しますか?
多分私は私の英語のために質問が完全に誤解されています。私はちょうどそれを越えることはできません。
EDIT:私のコード提供に基づき
、どのように私は割り当てを誤解したのですか?一般的に私は問題の説明を求めています。何が行われる必要があるかを説明するか、コードを正しい結果として取り上げて説明し、なぜこのようにするのか説明してください。
具体的なことができますか?あなたの質問は何ですか? – Amit
@Amit私の編集を確認してください – eomeroff