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

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

(0)

相关推荐

  • java实现翻转单词顺序列

    本文实例为大家分享了java实现翻转单词顺序列的具体代码,供大家参考,具体内容如下 最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 代码 借助上一篇文章左旋

  • java.util.Collection源码分析与深度理解

    写在开头 java.util.Collection 作为Java开发最常用的接口之一,我们经常使用,今天我带大家一起研究一下Collection接口,希望对大家以后的编程以及系统设计能有所帮助,本文所研究的jdk版本为jdk1.8.0_131 明确一下几点: Collection是接口,其继承了Iterable接口 Collection属于单值类型集合,重点子接口List接口和Set接口 Java.util.List接口(有序.不唯一) ArraryList ArrayList 是一个数组队列,

  • java简单实现数组中的逆序对

    题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 解题思路: 一开始一头雾水,后面想到了使用归并排序的思想,其实有多少个逆序对,就是归并排序的时候,后面的数要超越前面多少个,嗯,好像不是很好说,要不然直接看代码吧.还要注意,题目当中说要输出取模的结果,这说明数据可能非常大,所以如果只是单纯的在最后取模的话可能还是无法避免数据太大的影

  • java中线程的状态学习笔记

    java开发中,我们经常会遇到线程的问题,比如你做一个商城,就需要考虑它的并发问题等等,今天给大家分享一下java中线程的状态 先说线程的第一个状态,是新建状态,这个是线程刚刚创建的时候,如: new Thread(),具体如图 线程的第二种状态是可执行状态,就是调用了start方法后的状态,当然了,一个运行的状态,他有可能是正在运行的,也有可能是没有运行的,只是他的状态是可运行的状态,具体如图 第三种状态是被阻塞或者处于等待的线程,处于这种状态下的线程是不活动且不运行的,比如说调用了wait方

  • Java构建乘积数组的方法

    本文实例为大家分享了Java构建乘积数组的具体实现代码,供大家参考,具体内容如下 给定一个数组A[0,1,-,n-1],请构建一个数组B[0,1,-,n-1],其中B中的元素B[i]=A[0]A[1]-A[i-1]*A[i+1]-*A[n-1]. 不能使用除法. 代码 解法一 暴力法,这是本能就能想到的解决办法. public static int[] multiply(int[] array) { if (array == null) { return null; } int len = ar

  • 理解 Java 核心基础精髓解析

    1.字符串不变性 下面这张图展示了这段代码做了什么 String s = "abcd"; s = s.concat("ef"); 2.equals() 方法与 hashCode() 方法的区别 HashCode 被设计用来提高性能.equals() 方法与 hashCode() 方法的区别在于: 如果两个对象相等(equal),那么他们一定有相同的哈希值. 如果两个对象的哈希值相同,但他们未必相等(equal). 3.Java异常类的层次结构 图中红色部分为受检查异

  • java之左旋转字符串介绍

    题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部.如把字符串abcdef左旋转2位得到字符串cdefab.请实现字符串左旋转的函数.要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1). 分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置.于是我们可以新开辟一块长度为n+1的辅助空间,把原字符串后半部分拷贝到新空间的前半部分,在把原字符串的前半部分拷贝到新空间的后半部分.不难看出

  • java实现左旋转字符串

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abcXYZdef",要求输出循环左移3位后的结果,即"XYZdefabc".是不是很简单?OK,搞定它! 代码 解法一 最直观的方式,依次将需要移位的字符移动至最后,但是每个字符都需要移动数组的长度-1,如果数组的长度是n,需要移k位,则总共需要移动 k * (n - 1) publ

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

    左旋转字符串 题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串 abcdef  左旋转 2  位得到字符串 cdefab.请实现字符串左旋转的函数. 要求时间对长度为 n  的字符串操作的复杂度为 O(n),辅助内存为 O(1). 分析: 网上看到解法很多种,就不详细说明了. 我采用的是数组不对称的交换时间复杂度应该是O(n). 代码实现(GCC编译通过): #include "stdio.h" #include "stdlib.h&q

  • Java常用类之字符串相关类使用详解

    目录 字符串相关类 1.String类的使用 2.理解String类源码 3.使用StringBuilder类 4.StringBuilder类源码 字符串相关类 String.StringBuilder.StringBuffer类是三个字符串相关类. String类代表不可变字符序列,StringBuilder类和StringBuffer类代表可变字符序列. 关于这三个类的详细的用法,在笔试和面试以及实际开发中经常能用到,我们必须掌握好它. 1.String类的使用 String的常用方法:

  • Java实现的文本字符串操作工具类实例【数据替换,加密解密操作】

    本文实例讲述了Java实现的文本字符串操作工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import org.apache.commons.lang.StringUtils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.BreakIterator; import java.util.Array

  • Java实现产生随机字符串主键的UUID工具类

    本文实例讲述了Java实现产生随机字符串主键的UUID工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import java.net.InetAddress; import java.util.UUID; /** * uuid工具类 * Created by charlin on 2017/9/9. */ public class UUIDUtil { private String sep = ""; private static int

  • java递归法求字符串逆序

    本文实例讲述了java递归法求字符串逆序的方法.分享给大家供大家参考.具体实现方法如下: public static String reverseString(String x) { if(x==null || x.length()<2) return x; return reverseString(x.substring(1,x.length()))+ x.charAt(0); } 希望本文所述对大家的java程序设计有所帮助.

  • java基于正则提取字符串中的数字功能【如提取短信中的验证码】

    本文实例讲述了java基于正则提取字符串中的数字功能.分享给大家供大家参考,具体如下: 使用Java正则可以很方便的从字符串中提取符合条件的内容. 1.提取字符串中所有的手机号: private void getPhoneNum(String smsBody) { Pattern pattern = Pattern.compile("(13|14|15|18)\\d{9}"); Matcher matcher = pattern.matcher(smsBody); while (mat

  • java获取昨天日期字符串的方法

    本文实例讲述了java获取昨天日期字符串的方法.分享给大家供大家参考,具体如下: import java.text.SimpleDateFormat; import java.util.Date; public class Test { /** * 获取昨天的日期字符串 * * @param nowDate * 当前日期的字符串 * @return */ public static String getLastDayInfo(String nowDate) { String yesterday

  • java 后台将base64字符串保存为图片的方法

    本文介绍了java 后台将base64字符串保存为图片的方法,分享给大家,具体如下: 直接上代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class Base64T

随机推荐