长度为n的整数数组循环左移m位

1.首先逆置数组前m个元素;

2.逆置余下n-m个元素

3.逆置整个数组a 

采用此算法仅需要很少的额外空间,在时间和空间上都很高效,而且代码很短。

#include <iostream>
using namespace std;
int a[100];
void reverse(int *a, int l, int r){
	int temp;
	for (int i = l; i <= (l + r) / 2; i++){
		temp = a[i];
		a[i] = a[l + r - i];
		a[l + r - i] = temp;
	}
}

int main(){
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)	cin>>a[i];
	reverse(a, 0, n - m - 1);
	reverse(a, n - m, n - 1);
	reverse(a, 0, n - 1);
	for (int i = 0; i < n; i++)	cout << a[i] << (i - n + 1 ? " " : "\n");
	return 0;
}


### 回答1: 以下是Python代码实现: ```python def left_rotate(arr, n, m): # 先将m对n取模,避免循环移动超过数组长度的情况 m = m % n # 如果m为,则不需要移动 if m == : return arr # 将前m个元素逆序 reverse(arr, , m-1) # 将后n-m个元素逆序 reverse(arr, m, n-1) # 将整个数组逆序 reverse(arr, , n-1) return arr def reverse(arr, start, end): while start < end: arr[start], arr[end] = arr[end], arr[start] start += 1 end -= 1 ``` 其中,`left_rotate`函数接受三个参数,分别为整数数组`arr`、数组长度`n`和循环左移数`m`。函数内部先将`m`对`n`取模,避免循环移动超过数组长度的情况。然后,将前`m`个元素逆序,将后`n-m`个元素逆序,最后将整个数组逆序。最终返回移动后的数组。 `reverse`函数用于将数组中指定范围内的元素逆序。 ### 回答2: 对于这个问题,我们可以采用以下思路进行解决。 首先,我们需要了解什么是循环左移循环左移是将一个数组中的元素从左到右循环移动m,即数组的第m+1到最后一个元素移到数组的前m,而数组的前1到第m个元素则移到数组的最后m个置。 接下来,我们可以使用以下方法进行数组循环左移: 1. 创建一个临时数组temp,用于存储要循环左移的元素 2. 将数组中前m个元素拷贝到temp数组中 3. 将数组中第m+1到最后一个元素往前移动m,即将第m+1个元素赋值给第一个元素,第m+2个元素赋值给第二个元素,以此类推 4. 将temp数组中的元素拷贝到数组的最后m个置,即将temp数组中的第一个元素赋值给数组的第n-m+1个元素,第二个元素赋值给数组的第n-m+2个元素,以此类推 经过以上步骤,我们就可以将给定的数组循环左移m。 下面是一个示例代码: ``` #include <iostream> using namespace std; void leftShift(int arr[], int n, int m){ int temp[m]; for(int i=0; i<m; i++){ temp[i] = arr[i]; } for(int i=0; i<n-m; i++){ arr[i] = arr[i+m]; } for(int i=0; i<m; i++){ arr[n-m+i] = temp[i]; } } int main() { int arr[] = {1,2,3,4,5}; int n = sizeof(arr)/sizeof(arr[0]); int m = 2; leftShift(arr, n, m); for(int i=0; i<n; i++){ cout << arr[i] << " "; } return 0; } ``` 上述代码中,我们定义了一个名为leftShift的函数,入参为要操作的数组arr、数组长度n,以及要进行的左移数m。在函数中,我们定义一个临时数组temp,用于存储前m个元素。接下来,我们将第m+1到最后一个元素往前移动m,再将temp数组中的元素拷贝到数组的最后m个置即可。 最后,在main函数中,我们定义了一个大小为5的数组arr,并将其传递给leftShift函数进行左移。运行结果为:3 4 5 1 2,符合预期。 综上所述,通过以上方法,我们就可以很方便地对数组进行循环左移。 ### 回答3: 这道题目要求我们编写一个程序,将一个大小为n的整数数组循环左移m。我们可以采用以下的思路: 1. 定义一个名为rotate的函数,传入三个参数,分别是整数数组a、数组长度n和要左移数m。 2. 首先,我们需要处理m的值,因为如果m比n大,我们可以将m对n取模,以达到循环移动的目的。 3. 然后,我们可以使用反转数组的方法,将数组分成两部分,分别是a[0:m-1]和a[m:n-1]。我们可以先反转a[0:m-1],再反转a[m:n-1],最后再反转整个数组。 4. 反转数组的方法,可以使用双指针,一个指向数组头部,一个指向数组尾部,不断交换它们所指向的元素,直到整个数组被反转完成。 下面是完整的代码实现: ``` #include <iostream> using namespace std; void reverse(int a[], int start, int end) { while (start < end) { int t = a[start]; a[start] = a[end]; a[end] = t; start++; end--; } } void rotate(int a[], int n, int m) { m = m % n; reverse(a, 0, m-1); reverse(a, m, n-1); reverse(a, 0, n-1); } int main() { int a[] = {1, 2, 3, 4, 5, 6, 7}; int n = sizeof(a) / sizeof(a[0]); int m = 3; rotate(a, n, m); for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; return 0; } ``` 在这个程序中,我们定义了两个函数,一个是reverse函数,用来反转数组的一部分;另一个是rotate函数,用来将整个数组循环左移m。 在程序中,我们首先定义了一个整数数组a,它的长度为7,的值为{1, 2, 3, 4, 5, 6, 7}。然后,我们定义了要左移数m为3。接下来,我们调用rotate函数,将a数组循环左移3。最后,我们使用for循环输出a数组中的元素,可以得到正确的结果:{4, 5, 6, 7, 1, 2, 3}。 以上是我对该问题的解答,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simon|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值