今天下午玩了一下CodeWars,在做第四题的时候突然反应过来,不应该只是把一道题解决了,还应该参考别人好的思路。比如说这一题反转数组,我花了好几行的代码,而别人只用一句就解决了。所以想要记录下来。
题目要求:
Object[] data = new Object[]{1, 2, 3, 4, 5};
rotate(data, 1) => {5, 1, 2, 3, 4}
rotate(data, 2) => {4, 5, 1, 2, 3}
rotate(data, 3) => {3, 4, 5, 1, 2}
rotate(data, 4) => {2, 3, 4, 5, 1}
rotate(data, 5) => {1, 2, 3, 4, 5}
rotate(data, 0) => {1, 2, 3, 4, 5}
rotate(data, -1) => {2, 3, 4, 5, 1}
rotate(data, -2) => {3, 4, 5, 1, 2}
rotate(data, -3) => {4, 5, 1, 2, 3}
rotate(data, -4) => {5, 1, 2, 3, 4}
rotate(data, -5) => {1, 2, 3, 4, 5}
我的解法:
public class Rotator {
public Object[] rotate(Object[] data, int n) {
Object[] result=new Object[data.length];
for (int i = 0; i < result.length; i++) {
int index=(Math.abs(n)*result.length+i-n)%result.length;
result[i]=data[index];
}
return result;
}
}
之所以乘上n倍的长度,是因为如果不这样,在n的绝对值大于数组长度时会出错。
排名比较前面的解法:
import java.util.Arrays;
import java.util.Collections;
public class Rotator {
public Object[] rotate(Object[] data, int n) {
Collections.rotate(Arrays.asList(data), n);
return data;
}
}
其实我也不知道谁的比较好,可是看到他的代码就一句话,觉得超厉害的。