社区
C语言
帖子详情
考一个比较经典的问题(2)
zjxiaoyu
2005-07-13 05:12:44
将n个元素的数组向左旋转i个位置(循环旋转)。
比如abcdefg向左旋转3个位置就是defgabc。
写简单的代码实现。
...全文
645
21
打赏
收藏
考一个比较经典的问题(2)
将n个元素的数组向左旋转i个位置(循环旋转)。 比如abcdefg向左旋转3个位置就是defgabc。 写简单的代码实现。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
netfloator
2005-07-14
打赏
举报
回复
这道题如果用到临时空间就太简单了,题目也失去了意义。我在学数据结构的时候看到过这道题。
Willpro
2005-07-14
打赏
举报
回复
www.mark.com
boxban
2005-07-14
打赏
举报
回复
前面各位大虾作得都不错,但个别有些小纰漏:
1。memcpy/memmove 里面的数量是以“字节”为单位计算的,因此对于int类型,应该是元素数目*sizeof(int)
2。应该考虑i > n 的情形,因此在处理前需做一个简单的检查:i %= n; if (i > 0) ....
jixingzhong
2005-07-14
打赏
举报
回复
或者用楼主的办法::
char a[100]; //100 is the max len!!
inverse(int p,int q);
{
//a[p] 到 a[q] 逆向
}
main()
{
int i,n; //输入N(字符串的长度),I(定位)
//加入输入字符串语句
inverse(0, i-1);
inverse(i, n-1);
inverse(0, n-1);
//输出!!
}
jixingzhong
2005-07-14
打赏
举报
回复
void recl(int *c,int n,int i)//c这数组,n为数组大小,i为起始位置
{
int *buf = new int[n];
memmove(buf,c+i,n-i);
memmove(buf+n-i,c,i);
memmove(c,buf,n);
delete[] buf;
return;
}
呵呵 ,原理是一样的。
RoninBlade
2005-07-14
打赏
举报
回复
不怎么会c语言。
如果可以使用copy的话,不如把给定的数据串复制一个一样的 "abcde" + "abcde"
移动几位,就从第几位开始取子串。
zjxiaoyu
2005-07-14
打赏
举报
回复
讨论的差不多了。欢迎进入下一个话题
http://community.csdn.net/Expert/topic/4144/4144339.xml?temp=.2981989
(附:上一个话题。 ;-)
http://community.csdn.net/Expert/topic/4142/4142186.xml?temp=.5108454
)
zjxiaoyu
2005-07-14
打赏
举报
回复
我开这个帖子的愿意原意是:用memcpy反复移的方法,中间内存要求比较高。而用1个中间变量反复循环写的方式那些边界调起来很繁琐,不够清晰。而那个3次转置的代码写起来就非常清晰,用书上的话说就是“想出错都难”,而且执行效率跟前面的差不多。
况且,如果要扩展的话,这种方法在将向量abc转换成为cba时,或者更长的时候,特别有效。
hackingtruth
2005-07-14
打赏
举报
回复
学习
spyol
2005-07-14
打赏
举报
回复
受教了~
K
2005-07-13
打赏
举报
回复
学习中
迷你苑
2005-07-13
打赏
举报
回复
学习中
wq_princess
2005-07-13
打赏
举报
回复
void left_cycle( char *d, int num )
{
int i, j;
char temp;
int len = 0;
while( d[len] != '\0' )
len ++;
for( i = 0; i < num; i ++ )
{
temp = d[0];
for( j = 0; j < len - 1; j ++ )
{
d[j] = d[j+1];
}
d[j] = temp;
}
}
whatsouta
2005-07-13
打赏
举报
回复
用
malloc
char *a = (char *)malloc(sizeof(char)*n);
if (a == NULL) exit(1); //用之前最好检查一下有没有申请内存成功
...
...
free(a);
aiguozhou
2005-07-13
打赏
举报
回复
我是新手,请问如果用C语言写的话,也能象上面各位大哥说的这样
char *b=new char[n];
new 一个新的数组么??
shizhen
2005-07-13
打赏
举报
回复
icansaymyabc(学习与进步)
做得漂亮:)
FBIq
2005-07-13
打赏
举报
回复
#define N 10
void main(void)
{
char a[N]="risdfght",temp[N];
int i=0,j,n;
printf("转之前%s\n",a);
printf("到转几位(1~4)");
scanf("%d",&n);
for(j=strlen(a)-n;a[j]!=0;j++)
temp[i++]=a[j];
for(j=0;j<strlen(a)-n;j++)
temp[i++]=a[j];
temp[i]=0;
printf("\n转之后%s",temp);
getch();
return;
}
icansaymyabc
2005-07-13
打赏
举报
回复
void lrota(char *a,int n,int i)
{
char *b=new char[n];
strncpy(b,a,n);
for(int j=0;j<n;j++) a[j]=b[(j+i)%n];
delete []b;
}
int main(int argc, char* argv[])
{
char buf[]={"abcdefghijklmn"};
printf("%s\n",buf);
lrota(buf,sizeof(buf)-1,3);
printf("%s\n",buf);
return 0;
}
zjxiaoyu
2005-07-13
打赏
举报
回复
这种方法在将向量abc转换成为cba时,特别有效。
zjxiaoyu
2005-07-13
打赏
举报
回复
哦。不错。有了memcpy确实比自己实现循环简单多了。
那个,书上说了另外一种方法。就是:
比如前i个元素通称为向量a,后面的称为b。a先自己反转,就是第一个元素放最后,第二个放倒数第二。然后b自己反转。最后整个大数组再反转一次。
就是
inverse(0, i-1);
inverse(i, n-1);
inverse(0, n-1);
加载更多回复(1)
五大基本算法及其
经典
问题
经典
问题
: 1.二分搜索 2.大整数乘法 3.Strassen矩阵乘法 4.棋盘覆盖 5.合并排序 6.快速排序 7.线性时间选择 8.最接近点对
问题
9.循环赛日程表 10.汉诺塔 五大常用算法之二:动态规划算法
经典
问题
: 1.最短路径
问题
...
【
经典
问题
】括号匹配
问题
括号匹配
问题
算是栈应用中
比较
经典
的
问题
了,在数据结构的书中还有各种
考
试中会出现。最近刷题的时候也遇到了,就想写一篇文章整理一下。 例题 题目来自Leetcode中国 给定
一个
只包括 (,),{,},[,] 的字符串,...
小学奥数平均数
经典
问题
汇总
小学奥数平均数
经典
问题
汇总,掌握这些平均数
问题
,小学奥数
考
试拿高分不是梦!
stm32
经典
笔试题_嵌入式面试的30道
经典
问题
!
今天为大家准备了嵌入式工程师面试经常遇到的30个
经典
问题
,希望可以帮助大家提前准备,不再惧怕面试。基础
问题
1讲一下stm32的时钟系统2C语言中堆和栈的区别;推挽输出是什么?3假如
一个
单片机上电之后不运行?这是...
动态规划
问题
经典
例题
DP(Dynamic Programming)定义: 动态规划是分治思想的延伸,通俗一点来说就是大事化小,...所有的子
问题
都只需要解决一次。 储存子
问题
的解 动态规划的本质,是对
问题
状态的定义和状态转移方程的定义(状态以及状态
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章