这里记录了一些让我在做题时遇见的自感比较经典且容易出错的题目。

数组元素循环右移问题

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将最后M个数循环移至最前面的M个位置。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4

这是我原来的代码

#include<stdio.h>
//我的方法是让所有的数组向后移动,再讲最后的几个挪到前面来

int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int arr[m];
	for(int i=0;i<m;i++){
		scanf("%d",&arr[i]);
	}
	for(int i=0;i<n;i++){
		int x=arr[m-1];
		for(int j=0;j<=m;j++){
			arr[m-j]=arr[m-j-1];
		}
		arr[0]=x;
	}
	for(int i=0;i<m;i++){
		printf("%d",arr[i]);
		if(i!=m-1)
            printf(" "); 
	}
}

这是老师的代码

//通过取余的方式处理数据并直接输出,省时省力!

#include <stdio.h>
int main() {
    int i,n,k,arr[101];
    scanf("%d%d",&n,&k);
    for(i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    k=k%n;    //防止右移长度超过数组长度
    for(i=n-k;i<n-k+n;i++){
        if(i==n-k)
            printf("%d",arr[i%n]);
        else
            printf(" %d",arr[i%n]);
    }
    return 0;
}

最长字符子串

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11

输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。

输入样例:
Is PAT&TAP symmetric?
输出样例:
11

#include <stdio.h>
#include <string.h>
int main() {
    int i,k,len,max=0;
    char arr[1005];
    gets(arr);
    for(i=0;arr[i]!='\0';i++){
        k=1;
        len=1;
        while(i>=k&&arr[i+k]!='\0'&&arr[i-k]==arr[i+k]){ 
            //不是第一个数据&&不越界&&前后相等(奇数情况)
            len+=2;
            k++;
        }
        if(len>max)
            max=len;
        k=1;
        len=0;
        while(i+1>=k&&arr[i+k]!='\0'&&arr[i-k+1]==arr[i+k]){
            //不越界&&前后相等(偶数情况)
            len+=2;
            k++;
        }
        if(len>max)
            max=len;
    }
    printf("%d",max);
    return 0;
}

切割绳子

现有 N 条绳子,它们的长度分别为 L1、L2、L3、L4······,如果从它们中切割出 K 条长度相同的绳子,这 K 条绳子每条最长能有多长?

输入格式:
第一行两个整数n和k(1<n<10000;1<k<10000)。
接下来n行,描述了每条绳子的长度L,L也是整数。

输出格式:
切割后每条绳子的最大长度。

输入样例:
4 11
802
743
457
539
输出样例:
200