手摇算法与字符串旋转

简介:

手摇法指通过三次reverse操作,实现数组的rotation:

>>如何实现字符串倒置

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--);
         }
     }

  

>>字符串旋转和手摇算法

《编程珠玑》里的一个题目:
请将一个具有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),下次再去看一下。


目录
相关文章
|
6月前
|
机器学习/深度学习 算法 JavaScript
【动态规划】【回文】【字符串】1278分割回文串 III
【动态规划】【回文】【字符串】1278分割回文串 III
|
4月前
|
算法
后缀数组算法介绍
后缀数组学习
38 2
|
6月前
|
算法
【算法总结】字符串哈希
【算法总结】字符串哈希
98 0
|
存储 算法 安全
算法训练Day9| 28. 实现 strStr();459.重复的子字符串;字符串总结 ;双指针回顾
算法训练Day9| 28. 实现 strStr();459.重复的子字符串;字符串总结 ;双指针回顾
字符串旋转结果
字符串旋转结果
37 0
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
字符串哈希
原题链接841. 字符串哈希 - AcWing题库 视频讲解AcWing 841. 字符串哈希 - AcWing
74 0
【那些年那些题】字符串旋转结果
【那些年那些题】字符串旋转结果
64 0
|
算法
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
82 0
|
算法
【26. 字符串哈希】
**用到字符串的地方一般可以用KMP算法。用KMP算法的一般都可以用字符串哈希。代码更简单。**(特殊的哈希方式,字符串前缀哈希法) - 把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。(`比较俩个区间字符串前缀是否相等就变成了比较俩个区间字符串哈希是否相同`) ### 核心 - `以一个K进制的角度,来吧字符串看成数字。`
149 0