社区
C语言
帖子详情
考一个比较经典的问题(2)
zjxiaoyu
2005-07-13 05:12:44
将n个元素的数组向左旋转i个位置(循环旋转)。
比如abcdefg向左旋转3个位置就是defgabc。
写简单的代码实现。
...全文
653
21
打赏
收藏
考一个比较经典的问题(2)
将n个元素的数组向左旋转i个位置(循环旋转)。 比如abcdefg向左旋转3个位置就是defgabc。 写简单的代码实现。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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中国 给定
一个
只包括 (,),{,},[,] 的字符串,...
小学奥数平均数
经典
问题
汇总
小学奥数平均数
经典
问题
汇总,掌握这些平均数
问题
,小学奥数
考
试拿高分不是梦!
动态规划
问题
经典
例题
DP(Dynamic Programming)定义: 动态规划是分治思想的延伸,通俗一点来说就是大事化小,...所有的子
问题
都只需要解决一次。 储存子
问题
的解 动态规划的本质,是对
问题
状态的定义和状态转移方程的定义(状态以及状态
C语言面试必问的
经典
问题
(纯”gan“货)
C语言面试必问的
经典
问题
1.预处理 1. 预编译,编译过程最先做的工作是啥?何时需要预编译 ?指令有什么 答:预编译就是预处理,就是把一些文本的替换工作工作 预编译指令:#include、#ifdef 、#ifndef、#else 、#...
C语言
70,021
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章