c语言-新手OJ, C语言 字符串顺序后移模块,超时,优化无思路 求大神对指点

问题描述

新手OJ, C语言 字符串顺序后移模块,超时,优化无思路 求大神对指点

for(i=1; i<=m; i++){
a=z[n];
for(p=&z[n]; p>=&z[2]; p--)
p=(p-1);
z[1]=a;
}

    ++++++++++++++++++++++++++++++++++++++++

    作用:将数组z[n]中的所有元素进行向右移m位, 多出来的左端补上。
    例如:   12345  m=1       变成     51234

    但是我的算法效率太低, 当数组很长, m很大时超时,
    求大神指点

解决方案

数组 12345 数组的长度大小 5 ,我们来看看m变化时数组元素的顺序
m的值 数组元素的顺序

0 12345
1 51234
2 45123

3 34512
4 23451
5 12345
6 51234 m=6 和 m=6%5 顺序一样,
7 45123 m=7 和 m=7%5 。。。。,
8 34512 m=8 和 m=8%5 。。。。,
9 23451 m=9 和 m=9%5 。。。。,
10 12345 m=10和 m=10%5=0(整除了,且是偶数倍) 和谁一样??? 就是他自己
11 51234 m=11和 m=11%5=1 。。。。。,
.......
n m=n 和 m=n%5 一样一样的,

看出什么了吗? 相信你有点感觉了。
m变化时,最好的情况: m=0 或者m是数组长度大小的偶数倍 数组的数组顺序是不变的。O(0)
最坏的情况: m是数组长度大小的奇数倍 直接将数组逆序就ok O(n)
综合下 (n/2)
ok剩下的不用我多说了,兄弟你可以搞定。这只是我的一点优化想法,移动之前先算一下,就ok

解决方案二:

百度上有个算法,你试试效率怎么样

 void Reverse(int *arr, int b, int e)
{
    for(; b < e; b++, e--)
    {
        int temp = arr[e];
        arr[e] = arr[b];
        arr[b] = temp;
    }
}

void RightShift(int *arr, int n, int m)
{
    m %= n;
    Reverse(arr, 0, n-m-1);
    Reverse(arr, n-m, m-1);
    Reverse(arr, 0, n-1);
}

main函数
    int z[8] = {1,2,3,4,5,6,7,8};
    RightShift(z, 8, 3);

解决方案三:

我觉得吧,可以试试先用m对数组长度取模

解决方案四:

你的思路有误区,谁说一定要一步步对数组的每一个元素的右移了?
比如1234...n右移m位(0<= m <= n),你直接新建一个数组,先将(n-m+1)~n放到数组开头,再将1~(n-m)位接在后面不就行了嘛。
这样不管你的n是多少,效率永远是O(n)。
之后更全面的考虑就是对m取膜了,不是为了效率,而是为了不造成数组越界

解决方案五:

定义一个变量代表头元素不可以么...?直接改头元素...?我觉的可以吧QAQ

时间: 2025-01-20 19:21:21

c语言-新手OJ, C语言 字符串顺序后移模块,超时,优化无思路 求大神对指点的相关文章

c语言-关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点

问题描述 关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点 下面代码主要实现链表的创建,插入,删除,并且能将两个年龄递增链表进行合并成递减链表 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错..功力不足实在解决不了..跪求大神解答..(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去..我肉眼实在找不出来.. #include<stdio.h> #include<stdlib.h> #incl

链接传参数-C语言,二维数组的元素,相同位置对应相加。求大神指教。

问题描述 C语言,二维数组的元素,相同位置对应相加.求大神指教. 两个二维数组,13列X64行,读取文件,元素相同位置对应相加,再求平均数.写出来之后,无法运行,一直都是seg fault11.还请大神指教. #include #include #include #include /*main program*/ int main() { int i,j,ave = 0; float filename1[832],filename2[832]; FILE*fp1,*fp2; /***read n

出错-我是新手 在linux 下 安装了 tomcat7 可启动不了啊 求大神指教

问题描述 我是新手 在linux 下 安装了 tomcat7 可启动不了啊 求大神指教 我安装完 tomcat 后在 执行 sh startup.sh 出现: /usr/local/soft/tomcat7/bin/catalina.sh: line 549: syntax error: unexpected end of file 我jdk 已经正确安装 能编码 和执行 java 文件 看网上帖子 我在 tomcat/bin/catalina.sh 中 添加了 export CATALINA_

pb-PB新手菜鸟,求大神前辈指点PB排序

问题描述 PB新手菜鸟,求大神前辈指点PB排序 在对数据窗口的数据进行排序的时候,根据不同的表头名进行升降排序.表头名也会因升降序而变动名称("表头名+△"或者"表头名+▽"),那么问题来了,现在是实现了排序,但是怎么保证点击某一个表头名的时候,其他的表头名没有升降排序带的△或▽.如:我先是根据"名称"进行排序,现在是"名称△",然后我又点击"描述"进行排序,结果会出现"名称△"和&qu

qt-Qt 字符串函数定义 小弟菜鸟一枚,求大神指导。

问题描述 Qt 字符串函数定义 小弟菜鸟一枚,求大神指导. 定义了一个类为 xt,变量filename:函数QString getname() 为什么QString xt::getname() { return filename:} 获取不到filename的值呢 解决方案 qt里有this没,加个this? 解决方案二: 不应该的,这么短的一个函数.稍微完整的点代码贴出来·· 解决方案三: 总共定义了两个类.xt和testdialog.类testdiaolog的lineEdit想要获取类xt的

c-怎样用正则表达式判断字符串是否符合这种格式:ABC######[0###,,求大神们指点,急急急

问题描述 怎样用正则表达式判断字符串是否符合这种格式:ABC######[0###,,求大神们指点,急急急 怎样用正则表达式判断字符串是否符合这种格式:ABC######[0###,,求大神们指点,急急急 解决方案 有个数限制吗?没有,直接匹配这个字符串不就可以了.你这里面哪些是可变的 解决方案二: #是什么意思?数字? abcd{5}[0dd{3} 解决方案三: abc.{5}[.dd{3} 解决方案四: ABC.{5}[0.{3}

用友软件-求大神帮忙指点修改SQL数据库中所有特定字符串

问题描述 求大神帮忙指点修改SQL数据库中所有特定字符串 俺有一门水课,看着书一步步地照着做一个用友软件的项目,真的很无聊,记录公司发生的各种交易.我现在想把同学的作业拿过来改一下然后上交.这个用友软件用SQL数据库管理数据.这个用友软件,每个项目有一个账套主管,各种交易需要主管在软件里授权签名.现在我想做的是,首先修改账套主管名字,然而由于各个交易的签字信息不会随账套主管名字改变,我还得修改各个交易的签字. 直观的办法是,直接在SQL里搜索所有值为账套主管名字的字符串,然后替换成我的名字,求S

指针-新手OJ,C语言 去除字符串中的所有空格模块, 不知为何出错,求大神指点

问题描述 新手OJ,C语言 去除字符串中的所有空格模块, 不知为何出错,求大神指点 作用: 把数组a中的所有空格去除, 并把后面的往前移动.例如: a b c变成:abc 字符指针 *p *q 数组a[] for(p=&a[0]; p!=''; p++)if(*p==' ')for(q=p; *(q+1)!=''; q++)*q=(q+1); //去除a字符串中的空格 但总是不对, 求大神指点. 解决方案 #include<stdio.h>int main(){ char str[20

c语言-求100~200间所有素数,已写代码,但不出结果,求大神指正,感谢!

问题描述 求100~200间所有素数,已写代码,但不出结果,求大神指正,感谢! 问题描述:小弟刚开始学C语言,碰到题目,画出流程图,但是不知为什么就是无法出结果,求大神帮忙指点! 这是我写的代码: #include #include int main() { int n,i,m; m=0; for(n=100;n<=200;) { for(i=2;i<=n-1;i++) {if((n%i)==0) break;} if(i=n) { printf("%d ",n); m++