情景描述:给定一个数组,对其进行多次翻转,并给出翻转的轨迹。给定的数组类似带有能轧出特定序列的痕迹的直木棒,翻转后的数组类似直木棒一次又一次连着翻转后轧出的痕迹。
示例:
1.给定的数组(类似已知长度的木棒,数组的元素相当于木棒
不同部位能够轧出的标记)
int[] ints={1,2,3,4}
2.翻转四次,轮番以最大索引的元素,或者最小索引的元素为
支点,应该能联想到铅笔之类的翻转吧!
ints=rotate(ints, 4)
3.翻转四次后的数组(先轧,后翻转,所以总共轧了五次,能想到吧)
{1,2,3,4,4,3,2,1,1,2,3,4,4,3,2,1,1,2,3,4}
数组多次翻转源码如下:
package compute;
import java.util.Arrays;
/**
*数组翻转
*问题描述:以现有数组的元素个数为翻转的基准长度,一步一步地翻转
*@create by gzx on 2022-2-3
*/
public class ArrayRotation {
/**
* @param args
*/
public static void main(String[] args) {
int[] ints= {1,2,3,4};
ints=rotate(ints, 4);
for(int ele:ints) {
System.out.print(ele);
}
}
/**
* @param original 原数组
* @param steps 翻转的步数
* @return 翻转后的数组
*/
public static int[] rotate(int[] original,int steps) {
int olen=original.length;
original = Arrays.copyOf(original, olen*(1+steps));
//一圈一圈地旋转
for (int step = 1; step <=steps; step++) {
if (0 == step % 2)/*进行平移操作*/ {
for (int i = 0; i < olen; i++) {
original[step*olen + i] = original[i];
}
} else if (1 == step % 2)/*进行反转操作*/ {
int nlen = (step+1)*olen - 1;
for (int i = 0; i < olen; i++) {
original[nlen - i] = original[i];
}
}
}
return original;
}
}