`
chenchuangfeng
  • 浏览: 80003 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

算法之道--左右旋转字符串

阅读更多
        定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。 
 
 以下算法实现了可以做旋转和右旋转....
原理:
abcde123456
根据要旋转的位数k,把数组分成两子串,例如K=6,进行右旋转,则把字符串分成 abcde 和 123456(K位)
划分技巧:右旋转,后面子串位数为K,剩下做为前面子串;若是左旋转,前面子串位数为K,剩下做为后面子串
                如果上面 abcde123456 进行左旋转 K=6位,则字符串的划分是:abcde1(K位)  和 23456
接着对abcde和123456分别进行逆序操作结果:
edcba和654321
合并后成 
edcba654321
再整体逆序
123456abcde
 
优点: 3个reverse 操作都是线性操作,前两个时间复杂度和为0(n/2),最后一个整体逆序时间复杂度为0(n/2),总时间复杂度是O(n),比起普通的相同功能算法时间复杂度要低
 
package 左旋转字符串;
import java.util.Scanner;
/**
 * 左旋转字符串  * 
 * @author ccf
 * 
 */
public class test {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("输入一行字符串:");
        Scanner input = new Scanner(System.in);
        char[] charArray = input.nextLine().toCharArray();
        System.out.println("输入要移动的位数");
        int shiftNum = Integer.parseInt(input.nextLine());
        System.out.println("你输入的字符串为" + new String(charArray) + " 要移动问位数为"
                + shiftNum);
        // charArray = RightShift(shiftNum, charArray);
        charArray = LeftShift(shiftNum, charArray);
        System.out.println("移位结果为:" + String.valueOf(charArray));
    }
    /**
     * 实现字符串的逆序
     * 
     * @param src
     * @param begin
     * @param end
     * @return
     */
    private static char[] reverse(char[] src, int begin, int end) {
        char temp;
        for (; begin < end; end--, begin++) {
            temp = src[begin];
            src[begin] = src[end];
            src[end] = temp;
        }
        return src;
    }
    /**
     * 
     * @param k
     *            偏移量
     * @param src
     */
    private static char[] RightShift(int k, char[] src) {
        src = reverse(src, 0, src.length - k - 1);
        src = reverse(src, src.length - k, src.length - 1);
        // 与左移位不同在于下标的选取,这里是取后面K位
        src = reverse(src, 0, src.length - 1);
        return src;
    }
    private static char[] LeftShift(int k, char[] src) {
        src = reverse(src, 0, k - 1);
        // 与右移位不同在于下标的选取,这里是取前面K位
        src = reverse(src, k, src.length - 1);
        src = reverse(src, 0, src.length - 1);
        return src;
    }
}
 
2
1
分享到:
评论
3 楼 chenchuangfeng 2013-02-01  
clz2008wan 写道
你逆序字符串的方法可以进一步优化
    /**
     * 
     * <字符串逆序>
     * @param src 
     * @param begin 起始位置
     * @param end   结束位置
     * @return
     */
    public char[] reverseString(char src[],int begin,int end)
    {
        char temp;
        while(begin != end)
        {
            temp=src[begin];
            src[begin]=src[end];
            src[end]=temp;
            begin++;
            end--;
        }
        
        return src;
    }



这个效率不是差不不多一样???请问有哪些巧妙之处??
2 楼 clz2008wan 2013-02-01  
你逆序字符串的方法可以进一步优化
    /**
     * 
     * <字符串逆序>
     * @param src 
     * @param begin 起始位置
     * @param end   结束位置
     * @return
     */
    public char[] reverseString(char src[],int begin,int end)
    {
        char temp;
        while(begin != end)
        {
            temp=src[begin];
            src[begin]=src[end];
            src[end]=temp;
            begin++;
            end--;
        }
        
        return src;
    }
1 楼 dsjt 2013-02-01  

相关推荐

    C#实现字符串SHA-256加密算法

    SHA-256是SHA-2家族的一员,它通过一系列复杂的数学运算(如位操作、异或、旋转等)将输入信息(字符串)转化为一个256位的摘要值。这个摘要具有不可逆性,即无法从摘要还原出原始信息,这使得它成为验证数据完整性...

    [Java算法设计]-两串旋转.java

    文档中涵盖了两个字符串旋转的基本概念,包括如何判断一个字符串是否为另一个字符串的旋转,并介绍了如何在Java中实现该算法。此外,文档还包括一个逐步指南,介绍如何在Java中实现两个字符串旋转的代码,包括详细的...

    [C++算法入门]-两串旋转练习题

    通过这个练习,读者将学习如何在C++中编写代码来判断两个字符串是否是通过旋转得到的,并解决与字符串旋转相关的算法问题。 文档中包含了一系列的练习题,涵盖了字符串旋转的基本概念、实现方法和应用场景。通过...

    数据结构-字符串.pptx

    除此之外,还有Manacher算法和BM算法(Boyer-Moore算法),这两个算法主要用于高效的字符串搜索,尤其是Manacher算法解决了处理具有回文特性的字符串时的性能问题。 掌握以上知识是理解和应用字符串处理的关键,而...

    Python《剑指offer》算法实现-字符串的左旋转

    1. 初级程序员注重算法和数据结构 2. 事先做好准备,对工作有热情 3. 面试过程放松。不要急于写代码,了解清楚所要解决的问题,多和面试官沟通,然后开始做一些整体的设计和规划。不要急于提交,自己测试几个用例避免错误...

    旋转字符串1

    旋转字符串问题是一个经典的字符串处理问题,它出现在许多编程竞赛和面试中,比如LeetCode平台上的题目。本问题的核心是判断给定的两个字符串A和B是否可以通过对A进行一定次数的旋转操作变成相同。 首先,我们需要...

    编程算法练习--没事的时候练练

    - 将数字转换为字符串,然后反转字符串再转回数字。 - 或者通过数学方法逐步提取每一位,构造反转后的数字。 #### 知识点十二:折扣计算 - **描述**:根据消费金额计算不同档次的折扣。 - **实现思路**: - 根据...

    c语言实现md5算法字符串加密(vc调试通过)

    - 结果转换:将计算得到的128位二进制结果转换成32位的十六进制字符串,方便人类阅读和比较。 在`md5.c`文件中,你应该能看到实现MD5算法的具体代码,包括上述步骤的各个部分。通过VC编译器进行编译和调试,确保...

    算法-leetcode-剑指offer上的题很多

    - **字符串旋转(Rotate String)**: 将字符串进行旋转操作。 - **反转单词(Reverse Words)**: 将字符串中的单词顺序反转。 - **验证回文字符串(Valid Palindrome)**: 判断一个字符串是否是回文。 - **最长回文子串...

    华为编程题及字符串编程

    例如,可能需要实现一个高效的算法来判断两个字符串是否互为旋转字符串(一个字符串可以通过将另一字符串的某个部分移动到开头形成)或者找出字符串中最长的回文子串等。 接下来,关于字符串操作的常见方法。在...

    Burrows-Wheeler压缩算法JAVA实现

    - 首先,对输入字符串进行全排列,生成所有可能的旋转字符串。 - 接着,将这些旋转字符串按其最后一个字符的字典序进行排序。 - 最后,取排序后的第一列作为BWT结果。 2. **逆Burrows-Wheeler转换**: - 逆BWT...

    c常用算法程序集-徐士良

    - **KMP算法**:用于字符串匹配,避免不必要的回溯,提高匹配效率。 - **动态规划**:在字符串操作中,如最长公共子序列、最长重复子串等问题,常采用动态规划方法求解。 7. **计算几何**: - **点线段距离**:...

    程序员编程艺术:面试和算法心得

    **1.1 旋转字符串** - **题目描述**: 给定一个字符串,如 "abcdef",要求把字符串前面的若干个字符移动到字符串的尾部,例如将 "a" 和 "b" 移动到尾部,使得原字符串变成 "cdefab"。要求实现一个函数,其时间复杂度...

    面试高频算法题总结-剑指Offer题解

    字符串 链表 栈和队列 二叉树 图 堆 线段树 字典树 单调栈 算法 二分查找 排序 递归 动态规划 分治 记忆化搜索 贪心 回溯 位运算 数学 设计 其他 共66题 面试题3:数组中重复的数字 面试题4:二维数组的查找 面试题5...

    python-leetcode面试题解之第249题移位字符串分组.zip

    标题中的“python-leetcode面试题解之第249题移位字符串分组”提示我们,这是一份关于Python编程语言在LeetCode平台上的面试题解答,具体是针对第249题,主题是“移位字符串分组”。LeetCode是一个广受欢迎的在线...

    经典算法题目与答案-含代码

    在编码实现方面,书籍提供了大量的练习题,如字符串处理问题,包括实现strStr()函数、判断两个字符串是否是变位词、字符串逆序、回文检测、旋转字符串等,这些问题能够帮助程序员提高对字符串操作的熟练度。...

    编程之法:面试和算法心得-052320401

    1. **旋转字符串**:讨论如何对字符串进行旋转操作,例如将字符串"abcde"旋转k位得到"edcba",并解决相关的比较和搜索问题。 2. **字符串包含**:研究如何检查一个字符串是否包含在另一个字符串中,可能涉及KMP算法...

    面试---10. 数据结构与算法.pdf

    最后使用KMP算法或其他字符串匹配算法判断新字符串中是否包含目标字符串。这种方法的时间复杂度为O(n)。 - **扩展内容**: - KMP算法的核心在于构建next数组,用于优化模式串的匹配过程,避免不必要的回溯。 - ...

    C语言左旋转字符串与翻转字符串中单词顺序的方法

    首先,让我们详细讨论左旋转字符串。左旋转字符串的操作是将字符串的一部分移动到字符串的末尾。例如,将字符串 "abcdef" 左旋转2位得到 "cdefab"。要实现这样的功能,一种常见方法是分三步进行:首先,反转整个字符...

    左旋转字符串1

    首先,我们需要明确旋转字符串的基本思路。假设我们有一个字符串`s`,其长度为`len`,我们要将其左旋转`k`次。对于一次左旋转,我们可以先将字符串的第一个字符存储起来,然后将剩余的字符依次向前移动一位,最后将...

Global site tag (gtag.js) - Google Analytics