手摇算法与字符串旋转

手摇法指通过三次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),下次再去看一下。

时间: 2025-01-26 05:11:04

手摇算法与字符串旋转的相关文章

PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)_php技巧

本文实例讲述了PHP中strnatcmp()函数"自然排序算法"进行字符串比较用法.分享给大家供大家参考,具体如下: PHP中strnatcmp()函数使用"自然"算法来比较两个字符串(区分大小写),通常在自然算法中,数字 2 小于数字 10.而在计算机排序中,10 小于 2,这是因为 10 中的第一个数字小于 2. strnatcmp()函数的定义如下: strnatcmp(string1,string2) 参数说明: string1  必需.规定要比较的第一个字

字符串面试题(四)— 判断一个字符串是否为另外一个字符串旋转之后的字符串

判断一个字符串是否为另外一个字符串旋转之后的字符串. 例如: 给定s1 = AABCD和s2 = BCDAA,返回1, 给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到DAABC AABCD右旋两个字符得到CDAAB 思路:根据左旋或右旋结果和原字符串的联系,可以将一个给定的字符串拷贝一份放在该字符串的后面得到新的字符串,只需要判断另一个字符串是不是组合的新字符串的子字符串就可以解决问题. 例如:

Rolling Hash(Rabin-Karp 算法)匹配字符串与anagram串

该算法常用的场景 字符串中查找子串,字符串中查找anagram形式的子串问题. 关于字符串查找与匹配 字符串可以理解为字符数组.而字符可以被转换为整数,他们具体的值依赖于他们的编码方式(ASCII/Unicode).这意味着我们可以把字符串当成一个整形数组.找到一种方式将一组整形数字转化为一个数字,就能够使得我们借助一个预期的输入值来Hash字符串. 既然字符串被看成是数组而不是单个元素,比较两个字符串是否想到就没有比较两个数值来得简单直接.去检查A和B是否相等,我们不得不通过枚举所有的A和B的

经典算法-字符串的颠倒

{ for(int i =0; j< strlen(s)-1; i {  char c=s[i];  s[i]=s[j];  s[j]=c; }}此函数原出自Kernighan和Ritchie合作的经典作品TCPL第二版评注:此算法无论是从时间复杂度,还是从使用最小空间方面,都应该是最优了.时间上只用了遍历字符串长度一半的时间,空间上只是创建字符串长度一半的空间.当然我们还可以从空间上进一步减少使用.void Reverse(char s[]){ char c; for(int i =0; j<

【字符串处理算法】字符串转换为整数的算法设计及C代码实现

一.需求描述 输入一个由数字构成的字符串,编写程序将该字符串转换为整数并输出. 例如,如果输入的字符串是"12345",那么输出的整数是12345.注意,不要使用C语言的库函数atoi.   二.算法设计 我们都知道,如果给定一个整数123,那么其表示方法是:123=1*100+2*10+3.也就是说,一个整数是由其各位上的数字按照位数求和组成的. 因此,这个需求的解决方法很简单,只要将字符串中的各位数字按照其位数相加就行了.在此过程中,要考虑一些特殊情况. 程序的总体流程如图1所示.

【字符串处理算法】字符串包含的算法设计及C代码实现

一.需求描述 给定一个长字符串和一个短字符串,编写程序判断短字符串中的所有字符是否都在长字符串中.如果是,则长字符串包含短字符串:反之,不包含. 为了尽量包含大多数情况,字符串中可以包含大小写英文字母.数字和各种标点符号,并且区分大小写字母. 下面举几个例子予以说明: 1.如果长字符串是"ABCDE",短字符串是"ADC",那么短字符串中的所有字符都在长字符串中,即长字符串包含了短字符串. 2.如果长字符串是"ABCDE",短字符串是"

C#中使用基数排序算法对字符串进行排序的示例_C#教程

开始之前 假设最长字符串的长度是L,以L作为输入的长度, 然后假定所有的字符串都"补齐"到此长度,这个补齐只是逻辑上的,我们可以假想有一种"空字符", 它小于任何其它字符,用此字符补齐所有长度不足的字符串.例如:最长的字符串长度为9,有一个字符串A长度为6, 那么当比较第7位字符的时候,我们让A[7]为"空字符". 如果要包含所有的字符似乎并不容易,我们先定义一个字符集, 待排序字符串中的所有字符都包含在这个字符集里 //字符集 private

使用哈希算法将字符串映射到数组中

需求 将不同字符串映射到对应数组,数组不够时自动成倍扩容,比如有一个数组String[4],现在准备将不同的string映射到String[4]上,str5时会自动扩容并重新打散. str1-->String[3] str2-->String[0] str3-->String[2] str4-->String[1] 方案 先使用哈希运算,比如用murmurhash3_x86_32算法得到一个32位的值a. 再用一个掩码取得数组下标,这个掩码可用数组长度-1,比如原始数组长度为4,则

算法-序号字符串数组排序问题

问题描述 序号字符串数组排序问题 字符串数组单个字符串长度不定数字间以-分隔 1-3-12-3-210-23-3-3-3-3-31-1-14-1-2 排序后: 11-1-11-32-3-23-3-3-3-3-34-1-210-2 求思想 解决方案 2752:字符串数组排序问题(java语言) 解决方案二: C语言自带函数strcmp(s1,s2) 说明: 当s1 当s1=s2时,返回值=0 当s1>s2时,返回值>0两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符