指针原来是套娃的


私信TA

用户名:uq_92467646842

访问量:43451

签 名:

数学改变科学,科学改变世界

等  级
排  名 10
经  验 25185
参赛次数 49
文章发表 128
年  龄 0
在职情况 学生
学  校
专  业 物联网工程

  自我简介:

QQ:2830671713

解题思路:
第一种思路,将数组整体后移k位,然后让超出的部分回到首部。

大概是这样的

【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】【】【】

【】【】【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】//整体后移

【9】【10】【1】【2】【3】【4】【5】【6】【7】【8】【】【】//越界回归


image.png

这个做法的缺点是需要额外的数组空间,而且代码量多。


参考代码:

#include <stdio.h>
 
int main()
{
    int i,j=0;
    int x,n;
    int p[1007]={0};
     
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&p[i]);
    }
    scanf("%d",&x);
     
    for(i=x+n-1;i>=0;i--){//全部移动x位
        p[i]=p[i-x];
    }
     
    j=n;
    for(i=0;i<x;i++,j++){
        p[i]=p[j];
    }
     
    for(i=0;i<n;i++){
        printf("%d ",p[i]);
    }
     
    return 0;
}

第二种做法是使用取余判断。

以题目数据为例

10

1 2 3 4 5 6 7 8 9 10

2

最后的结果为

9 10 1 2 3 4 5 6 7 8 

也就是说在第9位置上的“9”来到了第1号位置,第10位置的“10”来到了第二号的位置,其他的数全部向后移动了两位。

向后移动两位就是下标+2来实现,而对于9号位10号位+2以后会变成11和12,超出数组范围,他们应该在1号和2号才对。

取余操作恰好可以实现这一点,11%10=1 12%10=2。对于超出了多少,就会回到多少,11号超出了1个位置,就会回到1位置。

这个代码的缺点是使用了额外的空间,优点是代码量少。

代码实现如下:

#include <bits/stdc++.h>

using namespace std;

int main(){
	int n,k;
	int p[1007],s[1007];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i];
	}
	cin>>k;//需要移动多少位 
	for(int i=0;i<n;i++){
		s[(i+k)%n]=p[i];//核心代码,取余归位 
	}
	for(int i=0;i<n;i++){
		cout<<s[i]<<" ";//打印输出 
	}
	 
	return 0;
}

第三种方法,通过调整输出顺序,来实现直接打印,核心也是第二种的取余的操作。

优点是代码量少,不需要额外的空间,缺点是只适用于竞赛和一些oj判题,数组内的存放还是之前输入的样子,不适用于面试等。

参考代码:

#include <bits/stdc++.h>

using namespace std;

int main(){
	int n,k;
	int p[1007],s[1007];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i];
	}
	cin>>k;//需要移动多少位 
	for(int i=0;i<n;i++){
		cout<<p[(i+n-k)%n]<<" "; //核心代码
	}
	 
	return 0;
}


 

0.0分

180 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

#include<stdio.h>
#include<math.h>
int main()
{
	int i;
	int m,n;
	int x[100];
	int y[100];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&x[i]);
	}
	scanf("%d",&m);
	shift(x,y,n,m);
	printf("\n");
	return 0;
}
int shift(int x[],int y[],int n,int m);
int shift(int x[],int y[],int n,int m)
{
	
	int i;
	for(i=0;i<n;i++)
	{
		y[i+m]=x[i];
		if((i+m)>n-1)
		{
			y[abs(i+m-n)]=y[i+m];
		}
	}
	for(i=0;i<n;i++)
	{
		printf("%d ",y[i]);
	}
}
做了好久,呜呜呜
2024-03-15 20:05:23
#include <stdio.h>
void sort(int* p,int* w, int n,int m)
{
	int c = 0;
	for (int i = n - m; i < n; i++)
	{
		*w++ = *(p + i);
	}
	for (int i = 0; i < n - m; i++)
	{
		*w++ = *(p + i);
	}
}
int main()
{ 
	int n;
	scanf("%d", &n);
	int arr[1000] = { 0 } ,ar[100] = { 0 } ;
	int c = 0,m;
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	scanf("%d", &m);
	sort(arr,ar, n,m);
	while (ar[c] != 0)
	{
		printf("%d ", ar[c++]);
	}
	return 0;
}
2024-03-03 20:16:40
#include<stdio.h>
int main()
{
    int n,m;
    scanf("%d",&n);
    int a[1007];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(int i=n-m;i<n;i++)
        printf("%d ",a[i]);
    for(int i=0;i<n-m;i++)
        printf("%d ",a[i]);
    return 0;
}
2024-02-19 16:12:17
#include<stdio.h>
void houyi(int a[],int m,int n)
{
	int b=0;
	int temp[m];
	for(int i=0;i<m-n;i++)
	{
		temp[i+n]=a[i];
	}
	for(int j=m-n;j<m;j++)
	{
		temp[b]=a[j];
		b++;
	}
	for(int i=0;i<m;i++)
	{
		printf("%d ",temp[i]);
	}
}
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int a[m];
	for(int i=0;i<m;i++)
	{
		scanf("%d",&a[i]);
	}
	houyi(a,m,n);
	return 0;
}大神,这为什么不对?
2023-11-05 11:17:54
#include<stdio.h>
int main(void)
{
	int n;
	int arr[1008]={0};
	int x; 
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	scanf("%d", &x);
	for (int i = x; i < n ; i++)
		printf("%d ", arr[i]);
	for (int i = 0; i < x; i++)
		printf("%d ", arr[i]);
	return 0;
}
2023-09-15 14:35:35
#include<stdio.h>
int main(void)
{
	int n;
	int arr[1008]={0};
	int x; 
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
		scanf_s("%d", &arr[i]);
	scanf_s("%d ", &x);
	for (int i = x; i < n ; i++)
	{
		printf("%d ", arr[i]);
	}
	for (int i = 0; i < x; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
2023-09-15 14:30:47
#include<stdio.h>

void change(int a[100],int n,int m)
{
	int i,k;
	printf("%d",a[n-m]);
	for(k=1;k<m;k++)
	{
		printf(" %d",a[n-m+k]);
	}
	for(k=0;k<n-m;k++)
	{
		printf(" %d",a[k]);
	}
}

int main()
{
	int a[100];
	int i,n,m;
	scanf("%d",&n);
	scanf("%d",&a[0]);
	for(i=1;i<n;i++)
	{
		scanf(" %d",&a[i]);
	}
	scanf("%d",&m);
	change(a,n,m);

	return 0;
}
2023-05-07 21:19:50
void Order(int arr1[], int arr2[], int m, int n)
{
    int i = 0;
    int j = 0;
    for (i = n - m; i < n; i++)
    {
        arr2[j] = arr1[i];
        j++;
    }
    for (i = 0; i < n - m; i++)
    {
        arr2[j] = arr1[i];
        j++;
    }
}

int main()
{
    int n = 0;
    int m = 0;
    int i = 0;
    int arr1[10] = { 0 };
    int arr2[10] = { 0 };
    scanf("%d", &n);
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &arr1[i]);
    }
    scanf("%d", &m);
    Order(arr1, arr2, m, n);
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr2[i]);
    }
   return 0;
}
2023-05-05 01:29:56