1.1字符串的旋转

题目:给定一个字符串,要求将字符串的前面若干个字符移到字符串的尾部。如有字符串“abcdef”,将前3个字符移到字符串尾部变成“defabc”。写一个函数实现此功能。

解法1:蛮力移位

比如将‘a‘移动到最后一位,就将‘a‘赋值给一个临时变量,然后把后面n-1个字符均向前移动一位(注意移动的时候由前向后依次进行,否则会将有用的值覆盖掉),最后将临时变量中的字符赋值给最后一位。若要移动m位字符,就重复调用这个函数m次;对于长度为n的字符串,,假设需要移动m个字符到尾部,总共需要m*n次移动,因此时间复杂度为O(mn),

空间复杂度为O(1)。

参考代码如下:

public class ReversrString1 {
    public static void ReverseString1(char[] sa,int len,int m)
    {

        if (len <= m){
            System.out.println("sa is too small!!");
        }
        char t = sa[0];
        for(int i = 1;i<len;i++){
            char temp = sa[i];
            sa[i-1] = temp;
        }
        sa[len-1] = t;

    }

    public static void LeftRotateString(String str, int m)
    {
        if (str == null||str.length() == 0){
            System.out.println("null");
        }
        int n = str.length();
        char[] sa = str.toCharArray();
        while(m-->0){
            ReverseString1(sa,n,m);
        }
        System.out.print(sa);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int m = 4;
        String str = "abcdef";
        LeftRotateString(str,m);

    }

}

解法2:三次反转

思路:先将一个字符串分割成两个部分,然后把这两个部分的字符串分别反转,最后再对整个字符串进行整体反转,即可解决问题。

举个栗子:输入:字符串"abcdef”,移动3位

输出:字符串"defabc”

1、将原字符串划分为两个部分,X = "abc",Y = "def"

2、反转X得到"cba",反转Y得到"fed"

3、最后将"cbafed"整体反转,得到"defabc"

这种把字符串先分为两个部分,各自反转,再整体反转的方法称为“三步反转”法,其时间复杂度为O(n),空间复杂度为O(1)

参考代码如下:

public class ReverseString2 {
    public static void ReverseString(char[] sa,int from,int to)
    {
        while(from<to){
            char t = sa[from];
            sa[from++] = sa[to];
            sa[to--] = t;
        }
    }
    public static void LeftRotateString(String str,int m)
    {
        if(str == null || str.length() == 0){
            System.out.print("It‘s wrong!");
        }
        int n = str.length();
        if (m>n){
            m = m%n;
        }
        char[] sa = str.toCharArray();
        ReverseString(sa,0,m-1);
        ReverseString(sa,m,n-1);
        ReverseString(sa,0,n-1);
        System.out.println(sa);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = "abcdef";
        int m = 3;
        LeftRotateString(str,m);
    }

}

举一反三:

单词翻转:输入一个英文句子,反转句子中单词的顺序。要求单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,若输入"I am a student.",则输出"student. a am I"。

我依然采用三次反转的思路解决这题,主要是为了巩固前面学习的反转思路。网上还有很多大牛采用StringBuffer的方法也可方便解决问题。

思路:现将整体字符反转,再将每个单词反转

时间复杂度为O(n),空间复杂度为O(1)。

参考代码如下:

public class ReverseEnglishSentence {
    private static char[] a;

    public static String ReverseString(char[] sa,int from ,int to)
    {
        while(from<to){
            char t = sa[from];
            sa[from++] =sa[to];
            sa[to--] = t;
        }
        return String.valueOf(sa);
    }
    public static void LeftRotateString(String str)
    {
        if(str == null||str.length() == 0){
            System.out.println("It‘s wrong!");
        }
        char[] sa = str.toCharArray();
        int len = sa.length;
        char[] saAll = ReverseString(sa,0,len-1).toCharArray();
        int j = 0;
        String a = null;
        for(int i = 0;i<len;i++){
            if (saAll[i] == ‘ ‘ || i == len-1 ){
                a = ReverseString(saAll,j,i-1);
                j =i+1;
                }
        }
        System.out.print(a);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = "I am a student.";
        LeftRotateString(str);

    }

}

时间: 2025-01-02 18:14:39

1.1字符串的旋转的相关文章

数组,链表,字符串 的旋转(未完待续)

字符串操作 题目一: 字符串的旋转(左旋操作) 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”.请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1). 题目出处:程序员编程艺术:面试和算法心得 微软面试100题 第二十六题 剑指Offer 第42题,翻转字符串vs 左旋转字符串 分析: 解法一:暴力法————循环移位,时间

【C语言】判断一个字符串是否是一个字符串的旋转字符串

//判断一个字符串是否是一个字符串的旋转字符串 //利用库函数实现 #include <stdio.h> #include <string.h> #include <assert.h> int IsRotate(char *str1, const char *str2) { assert(str1); assert(str2); strncat(str1, str1,strlen(str1)); if (NULL == strstr(str1, str2)) retur

【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。

package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数. * 要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1). * * @author Zealot * */ public class MS_26 { private void rotateString(String s, int rotate) { System.out.println(

算法笔记_022:字符串的旋转(Java)

目录 1 问题描述 2 解决方案 2.1 蛮力移位 2.2 三步反转 1 问题描述 给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部.例如,将字符串"abcdef"的前3个字符'a'.'b'和'c'移到字符串的尾部,那么原字符串将变成"defabc".请写一个函数实现此功能. 2 解决方案 2.1 蛮力移位 此方法将需要移动的字符一个一个地移到字符串的尾部,具体代码如下: package com.liuzhen.string_1; public clas

C语言:判断一个字符串是不是另一个字符串的旋转字符串

例如:给定s1 = AABCD和s2 = BCDAA,返回1, 给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到DAABC AABCD右旋两个字符得到CDAAB 分析题目之后我们发现,一个字符串有左旋转和右旋转两种.左旋转之后的字符串在原字符串拼接后的新字符串中:右旋转之后的字符串拼接之后可以找到源字符串. 这里我们会使用两个库函数strncat和strstr,关于两个函数的定义请自己查找. 字符

字符串的旋转

题目描述 对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边. 给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果. 测试样例: "ABCDEFGH",8,4 返回:"FGHABCDE" 问题简化:假设现在只要把E放在左边,那么我们可以先用一个变量记录E,然后把整个字符串向右移动一位,第一个空出来的位置用变量填充,即达到效果.那么现在的问题,就是把p到n-1的字符放在串首,还是和上面一样道理,只是

[CareerCup] 1.8 String Rotation 字符串的旋转

1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of si using only one call to isSubstring (e.g.,"waterbottle"is a rotation of "

C语言编程 字符串的旋转(左旋右旋及判断)

此前不太熟悉这种类型的题目,特此做一个合计的方法总结.包括字符串中字符的左旋(右旋),和判断一个字符串是否是由另一个字符串旋转(左旋或者右旋)而来. 一.字符串的左旋(右旋) 由于左旋和右旋思路一致,这里仅介绍左旋方法.这种题目有两种思路:1.首字符的后置以及其余元素的往前推置,循环重复此过程K次(k为左旋字符个数). eg:字符串为"ABCDEF\0",要旋转2个字符,首先保存首字符到一个变量,然后把其余变量全部提前一位置放,即为"BCDEF \0"(此处注意,最

剑指offer—左旋转字符串

题目:字符串的左旋转操作时把字符串前面的若干个字符转移到字符串尾部.请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到结果"cdefgab" 对于这一道题,按照普通的思想我们的想法一般都是先把字符a取出来,然后把后面你的字符串向前移动,然后把a放到最后.然后依次再把b进行一次,就可以了. 代码: #include<stdio.h> #include<stdlib.h> #includ