旋转数组

博客提出将给定数组顺时针旋转90度并打印的问题,还给出了示例数组旋转前后的输出结果,主要围绕数组旋转的信息技术问题展开。

问题:将一个给定的数组,顺时针旋转90度,并打印出来。

public class Test{
	public static void rotate(int[][] matrix) {
		int LR=0;
		int LC=0;
		int RR=matrix.length-1;
		int RC=matrix[0].length-1;
		while(LR<RR) {
			rotateEdge(matrix,LR++,LC++,RR--,RC--);
		}
	}
	//旋转的矩阵默认都是正方形的
	public static void rotateEdge(int[][] m,int LR,int LC,int RR,int RC) {
		int times=RC-LC;//times表示交换位置的次数
		int tmp=0;
		for(int i=0;i!=times;i++) {
			tmp=m[LR][LC+i];
			m[LR][LC+i]=m[RR-i][LC];
			m[RR-i][LC]=m[RR][RC-i];
			m[RR][RC-i]=m[LR+i][RC];
			m[LR+i][RC]=tmp;
		}
	}
	public static void printMatrix(int[][] matrix) {
		for(int i=0;i<matrix.length;i++) {
			for(int j=0;j<matrix[0].length;j++) {
				System.out.print(matrix[i][j]+" ");
			}
			System.out.println();
		}
	}
	public static void main(String[] args) {
		int[][] matrix= {{1,2,3},{4,5,6},{7,8,9}};
		printMatrix(matrix);
		rotate(matrix);
		System.out.println();
		printMatrix(matrix);
	}
		
}

输出:
1 2 3
4 5 6
7 8 9

7 4 1
8 5 2
9 6 3

### C语言实现旋转数组的功能 在C语言中,可以通过多种方式实现数组旋转操作。以下提供两种常见的方法:一种基于反转法[^1],另一种基于逐位右移法[^2]。 --- #### 方法一:反转法 该方法的核心思想是通过对数组的部分区域进行三次反转来达到旋转的效果。具体步骤如下: 1. 反转数组的前 `numSize - k` 个元素。 2. 反转数组的后 `k` 个元素。 3. 最后再整体反转整个数组。 以下是具体的代码实现: ```c #include <stdio.h> // 定义反转函数 void reverse(int *a, int left, int right) { while (left < right) { // 当左指针小于右指针时继续交换 int tmp = a[left]; a[left] = a[right]; a[right] = tmp; left++; right--; } } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int numSize = sizeof(arr) / sizeof(arr[0]); // 计算数组长度 int k; printf("请输入需要旋转的次数:"); scanf("%d", &k); // 用户输入旋转次数 // 确保k不超过数组长度 k %= numSize; // 第一步:反转前 numSize - k 个元素 reverse(arr, 0, numSize - k - 1); // 第二步:反转后 k 个元素 reverse(arr, numSize - k, numSize - 1); // 第三步:反转整个数组 reverse(arr, 0, numSize - 1); // 打印结果 for (int i = 0; i < numSize; i++) { printf("%d ", arr[i]); } return 0; } ``` 这种方法的时间复杂度为 O(n),因为每一步都只涉及线性的操作。 --- #### 方法二:逐位右移法 该方法通过将数组中的每个元素向右移动 `k` 次的方式实现旋转。每次移动时,最后一个元素会被移到第一个位置。 以下是具体的代码实现: ```c #include <stdio.h> #define N 10 // 打印数组函数 void PrintArray(int ar[], int n) { for (int i = 0; i < n; ++i) { printf("%d ", ar[i]); } printf("\n"); } // 实现右旋数组函数 void RightRotateArray(int ar[], int n, int k) { for (int i = 0; i < k; ++i) { // 循环执行k次右移 int temp = ar[n - 1]; // 存储最后一个元素 for (int j = n - 1; j > 0; --j) { // 将每个元素向前移动一位 ar[j] = ar[j - 1]; } ar[0] = temp; // 把存储的最后一个元素放到第一位 } } int main() { int ar[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 初始化数组 int k; printf("请输入需要旋转的次数:"); scanf("%d", &k); // 用户输入旋转次数 // 调用右旋函数 RightRotateArray(ar, N, k); // 打印旋转后的数组 PrintArray(ar, N); return 0; } ``` 此方法较为直观,但时间复杂度较高,为 O(k \* n)。 --- #### 性能对比 - **反转法**适用于大规模数据场景,因为它只需遍历数组几次即可完成操作,时间复杂度较低。 - **逐位右移法**适合小规模数据或教学演示用途,但由于其嵌套循环结构,在大数据量下表现较差。 --- #### 寻找旋转数组中的最小值(扩展内容) 如果需要在一个已知被旋转过的有序数组中快速找到最小值,可以使用二分查找的方法[^3]。这种技术特别适用于处理大型数据集,能够显著提高效率。 以下是二分查找实现的一个例子: ```c #include <stdio.h> // 查找旋转数组中的最小值 int findMinInRotatedArray(int arr[], int low, int high) { if (high < low) return arr[0]; // 边界情况 if (high == low) return arr[low]; int mid = low + (high - low) / 2; if (mid < high && arr[mid + 1] < arr[mid]) { return arr[mid + 1]; } if (mid > low && arr[mid] < arr[mid - 1]) { return arr[mid]; } if (arr[high] > arr[mid]) { return findMinInRotatedArray(arr, low, mid - 1); } else { return findMinInRotatedArray(arr, mid + 1, high); } } int main() { int arr[] = {4, 5, 6, 7, 0, 1, 2}; int n = sizeof(arr) / sizeof(arr[0]); int minValue = findMinInRotatedArray(arr, 0, n - 1); printf("旋转数组中的最小值是:%d\n", minValue); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值