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

一个C语言数组:围成一圈,现在给你一个步长,要求每个元素按照步长移位,最后输出数组比如a[]={1,2,3,4,5,6,7};步长2要把1放在3那个位置,3放在5那个位置... 一个C语言数组:围成一圈,现在给你一个步长, 要求每个元素按照步长移位,最后输出数组
比如a[]={1,2,3,4,5,6,7};步长2
要把1放在3那个位置,3放在5那个位置,5放在7那个位置,7放在2那个位置,2放在4那个位置...
时间复杂度为O(n),空间复杂度越小越好
展开
 我来答
yun840421
2008-06-20 · TA获得超过229个赞
知道小有建树答主
回答量:156
采纳率:0%
帮助的人:0
展开全部
根据要求修改了,复杂度为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]);
}
dobymyself1987
2008-06-20
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
应该有判错机制 并不是所有的组合 数组的各位都可以得到移动
举例
1-8 步长为2 移动的永远是
1 3 5 7
然后利用加步长与数组长度求余得到移动地址 然后保存赋值即可

设立标志数组,实现判定结束和在不满足情况下返回
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
刀龙暗
2008-06-20 · TA获得超过1287个赞
知道小有建树答主
回答量:1671
采纳率:0%
帮助的人:0
展开全部
运行通过。代码如下:
#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 ;
for( i = 0 ; i < 7 ; i++)
{
cout << b[ i ] <<" " ;
}
delete b ;
return 0 ;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
297454977
2008-06-20
知道答主
回答量:10
采纳率:0%
帮助的人:0
展开全部
好难
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式