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<stdio.h>
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/