如何解决阵列旋转问题-无法获得所需的输出
我编写了一个代码,将大小为n的数组旋转d个元素。我用临时数组解决了这个问题。但是我得到了不同的输出。我的代码中有语法错误。谁能帮我? 代码
import java.util.Scanner;
public class RotateArray {
public static void rotate(int a[],int d,int n){
int temp[]=new int[n];
for(int i=d;i<a.length;i++){
for(int j=0;j<n-2;j++){
temp[j]=a[i];
}
}
for(int i=0;i<d;i++){
for(int j=n-2;j<temp.length;j++){
temp[j]=a[i];
}
}
System.out.println("result is");
for(int k=0;k<temp.length;k++){
System.out.println(temp[k]);
}
}
public static void main(String[] args) {
int size,d;
Scanner sc=new Scanner(System.in);
System.out.println("enter size");
size=sc.nextInt();
System.out.println("enter rotate count");
d=sc.nextInt();
int a[]=new int[size];
for(int i=0;i<size;i++){
a[i]=sc.nextInt();
}
rotate(a,d,size);
}
}
输入:
输入大小7
输入轮换计数2
输入数组a [] = 1 2 3 4 5 6 7
我得到的输出:
7 7 7 7 7 2 2
预期产量
3 4 5 6 7 1 2
解决方法
您的逻辑是不正确的,您不应该在任何地方都有双循环,它们会破坏所有内容,并且绝对没有理由在逻辑上具有双循环。
for(int i=d;i<a.length;i++){
for(int j=0;j<n-2;j++){
temp[j]=a[i];
}
}
这是因为temp
中的每个元素都将具有a[a.length - 1]
的值。外循环的所有迭代将被外循环的最后一次迭代完全覆盖,此时,i
将为a.length - 1
,然后迭代大部分temp
并覆盖所有它们a[a.length - 1]
的值。您误用了i
和j
,-2
应该是-d
(如果有的话)。
通常有两种方法可以做到这一点:手动将索引包装在数组边界周围,或使用模运算符为您包装。使用模数是一种更干净的方法,因此我将展示一种方法:
public static void rotate(int a[],int rotate){
int temp[]=new int[a.length];
for (int i = 0; i < a.length; i++) {
temp[i] = a[(i + rotate) % a.length];
}
System.out.println("result is");
for (int k = 0; k < temp.length; k++){
System.out.println(temp[k]);
}
}
然后您通过rotate(a,d);
您可以通过使用一个 for 循环 和一个 if 语句来简化您的代码。将 far 元素移到数组的开头,将 near 元素移到数组的末尾:
public static void rotate(int[] arr,int d) {
int[] temp = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
if (i < arr.length - d) {
// shift the far elements to
// the beginning of the array
temp[i] = arr[i + d];
} else {
// shift the near elements
// to the end of the array:
temp[i] = arr[i + d - arr.length];
}
}
// replace the contents of the array
// with the contents of the temp array
System.arraycopy(temp,arr,arr.length);
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
rotate(arr,2);
System.out.println(Arrays.toString(arr));
// [3,7,1,2]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。