恒生电子笔试题:LoopMove
来源:互联网 发布:免费网站推广软件 编辑:程序博客网 时间:2024/04/28 18:12
循环移动字符串:比如 "abcdefghi" 移动2就变成 "hiabcdefg"
当时实现:
void LoopMove(char * str, unsigned int nsteps){ assert(NULL != str); int len = strlen(str); nsteps %= len; while (nsteps > 0) { for (int i = len - 1; i > 0; --i) { char temp = str[i]; str[i] = str[i - 1]; str[i - 1] = temp; } --nsteps; }}
面试回来的路上发现 while 语句忘了写,呵呵。当然面试部分估计很差,因为我根本就不知道要说什么,要怎么说。。。
另外,这道题从本质上讲其实是旋转(rotate)两个子串
最简单的实现:
void Reverse(char * str, unsigned int len){ for (int i = 0; i < len / 2; ++i) { char temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; }}void LoopMove(char * str, unsigned int nsteps){ assert(NULL != str); int len = strlen(str); nsteps %= len; if (nsteps > 0) { Reverse(str, len - nsteps); Reverse(str + len - nsteps, nsteps); Reverse(str, len); }}
其实第一个实现还可以改进以提高效率,但第二个实现在效率上可以完胜第一个,所以没必要改了,另外可以看下STL的rotate的第三种实现,效率更高,但比较难理解。
---------------------------------------------------------------------
算了,还是把第一种的优化与第三种实现的代码写下吧。
第一种实现的优化:
void LoopMove(char * str, unsigned int nsteps){ assert(NULL != str); int len = strlen(str); nsteps %= len; if (0 == nsteps) { return; } for (int i = len - 1; i > 0; --i) { if (i < nsteps) { if (0 == len % nsteps) { break; } nsteps -= len % nsteps; len = i + 1; } char temp = str[i]; str[i] = str[i - nsteps]; str[i - nsteps] = temp; }}
第三种实现:
int gcd(int m, int n){ while (0 != n) { int t = n; n = m % n; m = t; } return(m);}void RotateCycle(char * head, char * tail, int nshift, char * start){ char temp = *start; char * p1 = start; char * p2 = start + nshift; while (p2 != start) { *p1 = *p2; p1 = p2; if (p2 + nshift >= tail) { p2 += nshift - (tail - head); } else { p2 += nshift; } } *p1 = temp;}void LoopMove(char * str, unsigned int nsteps){ assert(NULL != str); int len = strlen(str); nsteps %= len; if (0 == nsteps) { return; } int n = gcd(len - nsteps, len); while (n-- > 0) { RotateCycle(str, str + len, len - nsteps, str + n); }}-----------------------------------------------------------------------
我写的第一个实现太傻了,改下:
void LoopMove(char * str, unsigned int nsteps){ assert(NULL != str); int len = strlen(str); nsteps %= len; while (nsteps > 0) { char temp = str[len - 1]; for (int i = len - 1; i > 0; --i) { str[i] = str[i - 1]; } str[0] = temp; --nsteps; }}
- 恒生电子笔试题:LoopMove
- 2014恒生电子笔试题
- 08年恒生电子成都笔试题
- 恒生电子的坑爹Java笔试题
- 恒生电子2015春季校招笔试题
- 2016恒生电子秋招笔试两道算法题
- 2017年5月13日 恒生电子笔试题
- 2013年恒生电子笔试面试题
- 恒生电子
- Java知识:恒生电子的坑爹笔试题扩展的知识
- 恒生校招笔试题
- 2011年恒生电子校园招聘笔试题目
- 恒生笔试
- 恒生电子面试
- 二、恒生电子实习
- 恒生电子工作经历
- 恒生电子实习面筋
- 恒生电子软件工程师面试
- java.util.date java.sql.date java.sql.timestamp[轉]
- JDBC 连接数据库实例(Oracle\SQLServer\MySQL 驱动下载)
- Exception in thread "main" java.lang.ExceptionInInitializerError
- Git与github的使用
- Android 正移植到C#
- 恒生电子笔试题:LoopMove
- java例程练习(打印流)
- 浙江永强
- u-boot中nor flash的sector管理方式
- extern作用详解[转载]
- 实例成员和静态成员
- 链表:复杂链表的拷贝
- 关于TC35模块的一些注意事项。
- 【每日面试题】随机数构成的数组中找到长度大于=3 的最长的等差数列