多益网络2014校招的一道笔试题---左旋字符串
2014-05-07 23:37
239 查看
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,分析算法复杂度
当时答的时候用的方法太渣了,
思路是每次左移一位,移动K次。
12345678→23456781→34567812→45678123
这是我写的实现代码
虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(n^2)
后面在别人博客上看见一种比较简单有效而且复杂度比较好的方法---逆序
假设我要移动“12345678”的3位,我可以将字符串分为123,45678两部分
逆序排列123:321
逆序排列45678:87654
全部逆序32187654:45678123
这样也实现了左旋3位数
这是我实现的代码,已测试正确
算法复杂度为O(n)
总之还得再继续努力,特别是在数据结构和算法要下工夫,这样下一次笔试就能胸有成竹了!
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,分析算法复杂度
当时答的时候用的方法太渣了,
思路是每次左移一位,移动K次。
12345678→23456781→34567812→45678123
这是我写的实现代码
void LeftMove(char* str,int k,int n) { k = k%n; if (NULL == str||k<1||n<1) { return; //输出合法性检测 } while(k--) { int t = str[0]; for(int i=1;i<n;i++) { str[i-1] = str[i]; } str[n-1] = t; } }
虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(n^2)
后面在别人博客上看见一种比较简单有效而且复杂度比较好的方法---逆序
假设我要移动“12345678”的3位,我可以将字符串分为123,45678两部分
逆序排列123:321
逆序排列45678:87654
全部逆序32187654:45678123
这样也实现了左旋3位数
这是我实现的代码,已测试正确
char *Reverse(char *first,char *end) //逆序first指针到end指针之间的字符 { char *temp =first; if (first>=end||NULL==first||NULL==end) { return temp; } while (first<end) { swap(*first++,*end--); } return temp; } void swap(char&a,char&b) { char temp = a; a = b; b = temp; } char* LeftMove(char *str,int len,int n) //左旋函数 { if (NULL==str||n<0) { return str; } n = n%len; Reverse(str,str+n-1); Reverse(str+n,str+len-1); Reverse(str,str+len-1); return str; }
算法复杂度为O(n)
总之还得再继续努力,特别是在数据结构和算法要下工夫,这样下一次笔试就能胸有成竹了!
相关文章推荐
- TCP IP UDP协议的区别
- 网络白帽子:黑客里的活雷锋
- 网络延迟测试结果
- CCESocket: a general purpose TCP/UDP socket class for WinCE
- HTTP协议详解
- Sun开发的JINI技术在网络中的应用
- Sun开发的JINI技术在网络中的应用
- 常见网络端口 和 常见网络协议
- 常见网络端口 和 常见网络协议
- HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。
- centos6.4下安装apache的httpd服务
- TCP协议中的三次握手和四次挥手(图解)
- TCP协议中的三次握手和四次挥手(图解)
- 学习笔记1.1 AAA服务器及协议
- Netroid:强大、快速、易用、可扩展基于Volley实现的Android Http库
- select函数的第一个参数为什么是最大描述符加1呢
- 一些我推荐的和想上的网络课程(Coursera, edX, Udacity)
- 一些我推荐的和想上的网络课程(Coursera, edX, Udacity)
- 【ActionScript 3.0学习笔记回顾】网络通信流程相关类
- hdu 3036 Escape 网络流