Codility – Lesson 4 Time Complexity – MaxCounters
プログラミング能力を評価するオンラインテスト、Codilityで、Lesson 4 Time Complexity – MaxCountersに回答しました。
問題と結果画面
66%の評価。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Linq; class Solution { public int[] solution(int N, int[] A) { int[] array = new int[N]; for(int i = 0; i < A.Length; i++) { if(A[i] <= N) { array[A[i] - 1] += 1; } else { System.Array.Sort(array); int max = array[array.Length - 1]; array = Enumerable.Repeat<int>(max, array.Length).ToArray(); } } return array; } } |
問題と結果画面
66%の評価。
LINQからfor文に切り替えみたら、large_random1の処理時間が若干早くなった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; using System.Linq; class Solution { public int[] solution(int N, int[] A) { int[] array = new int[N]; for(int i = 0; i < A.Length; i++) { if(A[i] <= N) { array[A[i] - 1] += 1; } else { System.Array.Sort(array); int max = array[array.Length - 1]; for(int j = 0; j < array.Length; j++) { array[j] = max; } } } return array; } } |
問題と結果画面
77%の評価。
Array.Sort()を使わずにMath.Max()を使ったらパフォーマンスが少し向上した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; using System.Linq; class Solution { public int[] solution(int N, int[] A) { int[] array = new int[N]; for(int i = 0; i < A.Length; i++) { if(A[i] <= N) { array[A[i] - 1] += 1; } else { int max = 0; Array.ForEach(array, delegate(int num) {max = Math.Max(max, num);}); for(int j = 0; j < array.Length; j++) { array[j] = max; } } } return array; } } |
問題と結果画面
88%の評価。
Math.Max()を使わず、カウンタをインクリメントしたらパフォーマンスがまた少し向上した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; class Solution { public int[] solution(int N, int[] A) { int[] array = new int[N]; int max = 0; for(int i = 0; i < A.Length; i++) { if(A[i] <= N) { array[A[i] - 1] += 1; if(max < array[A[i] - 1]) max = array[A[i] - 1]; } else { for(int j = 0; j < array.Length; j++) { array[j] = max; } } } return array; } } |
問題と結果画面
100%の評価。
最大値で配列をリセットするfor文をメインのfor文の外に出し、100%を達成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System; class Solution { public int[] solution(int N, int[] A) { int[] array = new int[N]; int max = 0; int resetNum = 0; for(int i = 0; i < A.Length; i++) { if(A[i] <= N) { if (array[A[i] - 1] < resetNum) { array[A[i] - 1] = resetNum + 1; } else { array[A[i] - 1] += 1; } if(max < array[A[i] - 1]) max = array[A[i] - 1]; } else { resetNum = max; } } for (int i = 0; i < array.Length; i++) { array[i] = Math.Max(resetNum, array[i]); } return array; } } |