手摇算法与字符串旋转
手摇法指通过三次reverse操作,实现数组的rotation:
1.如何实现字符串倒置
1 2 3 4 5 6 7 8 9 10 11 | /** * 反转倒置 * 在由char[]转为Sting注意不要使用toSting方法 */ public static void reverse( char [] chr){ int n=chr.length- 1 ; //使用头尾两个指针从两边向中间扫,并且不断交换两个指针的内容 for ( int i= 0 ;i<chr.length/ 2 ;i++){ swap(chr,i,n--); } } |
2.字符串旋转和手摇算法
《编程珠玑》里的一个题目:
请将一个具有n个元素的一维向量x向左旋转i个位置。例如,假设n=8,i=3,
那么向量abcdefgh旋转之后得到向量defghabc。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /** * 用于反转字符数组中index1~index2位置的这一段 * 左闭右开区间,index1<=下标<index2 */ public static void reverse( char [] chr, int index1, int index2){ if (index2-index1 < 2 ) return ; int j=index2- 1 ; //右侧下标 for ( int i=index1;i<(index2+index1)/ 2 ;i++){ swap(chr,i,j--); } } /** * 旋转 * 使用三次反转,实现旋转 * 数组注意区间取值 * @param m 从位置m处进行旋转 */ public static void rotation( char [] chr, int m){ //第一次倒置0~m位置 reverse(chr, 0 ,m); //第二次倒置m~最后位置 reverse(chr,m,chr.length); //最后整体倒置 reverse(chr, 0 ,chr.length); } private static void swap( char [] arr, int index1, int index2){ char temp=arr[index1]; arr[index1]=arr[index2]; arr[index2]=temp; } |
手摇算法还可以用来优化归并排序,实现不需要额外空间开销的原地归并,即将空间复杂度降为O(1)。
本文来自博客园,作者:邴越,转载请注明原文链接:https://www.cnblogs.com/binyue/p/5194462.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南