Write a method mirror that doubles the size of a list of integers by appending the mirror image of the original sequence to the end of the list. The mirror image is the same sequence of values in reverse order. For example, if a variable called list stores this sequence of values:
[1, 3, 2, 7]
and we make the following call:
list.mirror();
then it should store the following values after the call:
[1, 3, 2, 7, 7, 2, 3, 1]
Notice that it has been doubled in size by having the original sequence appearing in reverse order at the end of the list. You may not make assumptions about how many elements are in the list. Because adding these elements might overrun the capacity of the underlying array, you may need to call ensureCapacity to enlarge this array.
Assume you are adding to the ArrayIntList class with following fields:
public class ArrayIntList { private int[] elementData; private int size; public void add(int value) { ... } public void add(int index, int value) { ... } public void ensureCapacity(int capacity) { ... } ... // your code goes here }
What improvements can I make to help on my future coding? Interested in knowing if there are other ways to tackle this question, and if the way I solved the problem is safe? This code interacts with the ArrayIntList.java class.
public void mirror() {
if (size != 0) {
int limit = size * 2;
this.ensureCapacity(limit);
size = limit;
for (int i = 0; i < size; i++) {
elementData[(limit - 1) - i] = elementData[i];
}
}
}
1 Answer 1
This is good code, because it does what it says on the tin. I do have two remarks:
The this.
in this.ensureCapacity(limit)
isn't necessary. Some people swear by adding it anyway, so it's a matter of style.
The other remark is that you loop over twice as many elements as needed because you set size
to limit
before looping. You can hold off until after:
public void mirror() {
if (size != 0) {
int limit = size * 2;
this.ensureCapacity(limit);
//size = limit; // [!] moved to below >>>
for (int i = 0; i < size; i++) {
elementData[(limit - 1) - i] = elementData[i];
}
size = limit; // [!] <<< moved from above
}
}
That's all. Good code.