回答編集履歴

1

思いつき

2020/07/25 09:41

投稿

xebme
xebme

スコア1090

test CHANGED
@@ -109,3 +109,75 @@
109
109
  }
110
110
 
111
111
  ```
112
+
113
+
114
+
115
+ **配列の添字を動かす**
116
+
117
+
118
+
119
+ ArrayListを使わず配列だけを使用するなら、連続した整数を与えて、添字をN-1〜0、0〜N-1へと動かせば良いことに気づいたので、メソッドを作成。`size`が配列のサイズ、`i`が連続した整数です。
120
+
121
+
122
+
123
+ ```Java
124
+
125
+ static int genIndex(int size, int i) {
126
+
127
+ return i%(2*size) - ((i/size)%2) * (2*(i%size)+1);
128
+
129
+ }
130
+
131
+ ```
132
+
133
+
134
+
135
+ 以下のように添字が動きます。Nは配列のサイズ。
136
+
137
+
138
+
139
+ - 0 <= i < 2*N
140
+
141
+ 0, 1, … N-1, N-1, … 1, 0
142
+
143
+ - N <= i < 3*N
144
+
145
+ N-1, … 1, 0, 0, 1, … N-1
146
+
147
+
148
+
149
+ テストケース。
150
+
151
+
152
+
153
+ ```Java
154
+
155
+ @Test
156
+
157
+ void testGenIndex() {
158
+
159
+
160
+
161
+ BiFunction<Integer,Integer,Integer> genIdx = list::genIndex;
162
+
163
+ Function<Integer,UnaryOperator<Integer>> supplyGen = size -> i -> genIdx.apply(size,i);
164
+
165
+ int size = 5;
166
+
167
+ UnaryOperator<Integer> gen = supplyGen.apply(size);
168
+
169
+
170
+
171
+ String result = IntStream.range(0,6*size).map(i -> gen.apply(i)).mapToObj(String::valueOf).collect(Collectors.joining(","));
172
+
173
+ assertEquals("0,1,2,3,4,4,3,2,1,0,0,1,2,3,4,4,3,2,1,0,0,1,2,3,4,4,3,2,1,0",result);
174
+
175
+
176
+
177
+ result = IntStream.range(size,7*size).map(i -> gen.apply(i)).mapToObj(String::valueOf).collect(Collectors.joining(","));
178
+
179
+ assertEquals("4,3,2,1,0,0,1,2,3,4,4,3,2,1,0,0,1,2,3,4,4,3,2,1,0,0,1,2,3,4",result);
180
+
181
+ }
182
+
183
+ ```