回答編集履歴
1
思いつき
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
|
+
```
|