今天参加了华为的面试,被一个算法题水了?如下:

来源:百度知道 编辑:UC知道 时间:2024/06/21 01:23:43
一个C语言数组:围成一圈,现在给你一个步长, 要求每个元素按照步长移位,最后输出数组
比如a[]={1,2,3,4,5,6,7};步长2
要把1放在3那个位置,3放在5那个位置,5放在7那个位置,7放在2那个位置,2放在4那个位置...
时间复杂度为O(n),空间复杂度越小越好

根据要求修改了,复杂度为O(n),没有引入额外的数组:)
#include <stdio.h>
#define N 7
void main(){
int a[N],step,temp;
printf("输入%d个整数:\n",N);
for(int l=0;l<N;l++)
scanf("%d",&a[l]);
printf("输入步长:\n");
scanf("%d",&step);
step=step%N;
int k=0,n=0;
for(int i=step;i<N+step;i++,k++){
if(step)
k=k%step;
n=i%N;
temp=a[n];
a[n]=a[k];
a[k]=temp;
}
printf("输出移位后的数组:\n");
for(int m=0;m<N;m++)
printf("a[%d]=%d\n",m,a[m]);
}

运行通过。代码如下:
#include <iostream>
using namespace std ;
int * re_pai( int a[], int n )
{
int i ;
int *b ;
b = new int[ n ] ;
for( i = 0 ; i < n ; i++ )
{
b[ (i +2) % n ] = a[ i ] ;
}
return b ;
}
int main()
{
int a[]={1,2,3,4,5,6,7};
int *b = re_pai( a, 7 ) ;
int i ;<