java实现左旋转字符串

 更新时间:2019年03月03日 15:31:42   作者:雨幕下的稻田  
这篇文章主要为大家详细介绍了java实现左旋转字符串,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

代码

解法一

最直观的方式,依次将需要移位的字符移动至最后,但是每个字符都需要移动数组的长度-1,如果数组的长度是n,需要移k位,则总共需要移动 k * (n - 1)

public static String leftRotateString(String str, int n) {
    if (Strings.isNullOrEmpty(str)) {
      return str;
    }
    if (n < 0 || n >= str.length()) {
      return str;
    }
    char[] strArray = str.toCharArray();
    while (n-- > 0){
      // 直接交换的方式,将需要移位的部分通过交换n-1次向左移动
      // 比如abcde,要移动2位,即cdead
      // 1. 将a移动至最后,此时是bcdea
      // 2. 将b移动至最后,此时是cdeab
      for (int i = 0; i < strArray.length - 1; i++) {
        swap(strArray, i, i + 1);
      }
    }
    return new String(strArray);
  }
 
  private static void swap(char[] str, int i, int j) {
    char temp = str[i];
    str[i] = str[j];
    str[j] = temp;
  }


解法二

借助字符串的反转,比如“ab”对应“ba”,“xyz”对应“zyx”,总共需要三步即可得到期望想过

  • 反转要移位的部分,”abcXYZdef”操作后是”cbaXYZdef”
  • 反转其余的部分,”cbaXYZdef”操作后是”cbafedZYX”
  • 反转整个字符串,”cbafedZYX”操作后是”XYZdefabc”
public static String leftRotateString2(String str, int n) {
    if (Strings.isNullOrEmpty(str)) {
      return str;
    }
    if (n < 0 || n >= str.length()) {
      return str;
    }
    char[] strArray = str.toCharArray();
    // 借助反转,分三步
    // 1. 反转要移位的部分
    // 2. 反转其余部分
    // 3. 整体反转
    reverse(strArray, 0, n - 1);
    reverse(strArray, n, strArray.length - 1);
    reverse(strArray, 0, strArray.length - 1);
    return new String(strArray);
  }
 
  /**
   * 反转字符串,两端依次进行交换即完成反转
   * @param str
   * @param start
   * @param end
   */
  private static void reverse(char[] str, int start, int end) {
    while (start < end) {
      swap(str, start, end);
      start++;
      end--;
    }
  }
 
  private static void swap(char[] str, int i, int j) {
    char temp = str[i];
    str[i] = str[j];
    str[j] = temp;
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring工作原理简单探索

    Spring工作原理简单探索

    这篇文章主要介绍了Spring工作原理简单探索,涉及Springaop与IOC,动态代理静态代理,反射等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 详解Spring Cloud Hystrix断路器实现容错和降级

    详解Spring Cloud Hystrix断路器实现容错和降级

    本篇文章主要介绍了详解Spring Cloud Hystrix断路器实现容错和降级,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 如何利用rabbitMq的死信队列实现延时消息

    如何利用rabbitMq的死信队列实现延时消息

    这篇文章主要介绍了如何利用rabbitMq的死信队列实现延时消息问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Mybatis源码分析之存储过程调用和运行流程

    Mybatis源码分析之存储过程调用和运行流程

    这一篇我们学习一下Mybatis调用存储过程的使用和运行流程,首先我们创建一个简单的存储过程,具体创建过程大家可以通过本文学习下
    2016-11-11
  • java实现数据结构单链表示例(java单链表)

    java实现数据结构单链表示例(java单链表)

    这篇文章主要介绍了java数据结构实现单链表示例,需要的朋友可以参考下
    2014-03-03
  • Java用栈实现综合计算器

    Java用栈实现综合计算器

    栈(stack)又名堆栈,它是一种运算受限的线性表,下面看一下如何在Java中,利用数组实现模拟一个栈,感兴趣的朋友跟随小编一起看看吧
    2022-06-06
  • Java GZip 基于内存实现压缩和解压的方法

    Java GZip 基于内存实现压缩和解压的方法

    这篇文章主要介绍了Java GZip 基于内存实现压缩和解压的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • java变量的区别浅析

    java变量的区别浅析

    对于java的变量天天见到,但有时候别人问起它们的区别有时候也说不全,所以就找了些资料整理了整理...
    2013-12-12
  • 消息中间件详解以及比较选择

    消息中间件详解以及比较选择

    这篇文章主要介绍了消息中间件详解以及比较选择,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot从Nacos读取MySQL数据库配置错误:Public Key Retrieval is not allowed的解决方案

    SpringBoot从Nacos读取MySQL数据库配置错误:Public Key Retrieva

    最近的项目,突然都从MySQL5.7升级到8.0了,有些项目能运行成功,有些项目遇到了问题,启动不成功,显示数据库方面的异常信息,本文给大家介绍了SpringBoot从Nacos读取MySQL数据库配置错误:Public Key Retrieval is not allowed的解决方案,需要的朋友可以参考下
    2024-04-04

最新评论