有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数(算法学习,C+Java(在学ing)代码)

2020.5.6

放假后的第一天,赶上夜班了= =

学习的第15天,明天就回学校咯

学习ing 学习ing

题目:

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。

例如:

输入:

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


C 代码

#include
void convet(int* arr, int n);
void Reverse(int *arr,int p,int q);

int main()
{
	int* arr, n;
	while (scanf("%d", &n) != EOF)
        //在输入回车换行后的空行位置,按 ctrl+z,再回车确认就是EOF咯
	{
		arr = (int*)malloc(n * sizeof(int));//申请空间
		for (int i = 0; i < n; i++)
			scanf("%d", arr + i);
		convet(arr, n);
		for (int i = 0; i < n; i++)
			printf("%d ", arr[i]);
		free(arr);//释放空间
	}
	return 0;
}

void convet(int* arr, int n)
{
	int m;
	scanf("%d",&m);
	if (m<0 || m>n)
		return ;
	else
	{
		Reverse(arr, 0, n - m - 1);//先将前n-m个数逆置
		Reverse(arr, n - m, n - 1);//将后面m个数逆置
		Reverse(arr, 0, n - 1);//最后再逆置
	}
}

void Reverse(int* arr, int p, int q)//将p~q的数逆置
{
	int temp;
	for (int i = p, j = q; i < j; i++, j--)
	{
		temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}

Java 代码

import java.util.Scanner;

class Reverse1{
	static void reverse(int arr[],int n,int m) {
		int a[]=new int[m];//将需要后移的数字存在这个数组当中
		for(int i=0;i<m;i++) {
			a[i]=arr[n-m+i];
			//存需要后移的数字
		}
		for(int i=n-1;i>=m;i--) {
			arr[i]=arr[i-m];
			//将前面n-m个数字后移
		}
		for(int i=0;i<m;i++) {
			arr[i]=a[i];
			//将那m个数字重新赋值过来
		}
	}
}

public class NumberBackmove {
	public static void main(String[] args) {
		Scanner input =new Scanner(System.in);
		int n=input.nextInt();
		int arr[]=new int[n];
		for(int i=0;i<arr.length;i++) {
			arr[i]=input.nextInt();
		}
		int m=input.nextInt();
		Reverse1.reverse(arr, n, m);
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+" ");
		}
		
	}
}

今天学到了学到了,C的做法蛮好的我觉着,我都没想到,靠着大佬的解析写了出来想通了

如有错误恳请大佬指点,感激不尽,溜了溜了~~

算法题目来源:https://www.dotcpp.com/

你可能感兴趣的:(算法学习)