首页 > 代码库 > 左旋转字符串

左旋转字符串

题目描述:
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
输入:
多组测试数据,每个测试数据包含一个字符序列S和非负整数K。其中S的长度不超过1000。
输出:

对应每个测试案例,输出新序列。

package Test21;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			String str = scanner.next();
			int n = scanner.nextInt();
			System.out.println(revString(str, n));

		}

	}

	/**
	 * ①:注意n的取值问题,因为是循环移位,所以可以采用取余数的方式 ②:借助了StringBuffer:来提高性能
	 * ③:借助了subString(beginIndex,endIndex)来简化了计算
	 * 性能分析:时间复杂度为o(n)---subString;空间复杂度为o(n)---StringBuffer
	 * 
	 * @param str
	 * @param n
	 * @return
	 */

	public static String reverse(String str, int n) {
		StringBuffer stringBuffer = new StringBuffer();

		int length = str.length();

		int m = n % length;

		if (m < 0) {

			return str;
		}
		// 直接将子字符串进行分割就行了,然后将分割的子串拼接在一起
		stringBuffer.append(str.substring(m, str.length())).append(
				str.substring(0, m));

		return stringBuffer.toString();

	}

	/**
	 * 思想:我们还是把字符串看成有两段组成的,记位XY。
	 * 左旋转相当于要把字符串XY变成YX。我们先在字符串上定义一种翻转的操作,
	 * 就是翻转字符串中字符的先后顺序。把X翻转后记为XT。显然有(XT)T=X。
	 * 
	 * 我们首先对X和Y两段分别进行翻转操作,这样就能得到XTYT。
	 * 接着再对XTYT进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。
	 * 正好是我们期待的结果。
	 * ①:首先对前半部分逆序;
	 * ②:然后对后半部分逆序;
	 * ③:然后对整体进行逆序
	 * 性能分析:时间复杂度为o(n),空间复杂度为o(1)
	 * 
	 * @param str
	 * @param n
	 * @return
	 */
	public static String revString(String str, int n) {

		if (str.length() == 0) {
			return str;
		}
		char[] c = str.toCharArray();
		int m = n % str.length();
		// 将(0,m)的字符翻转

		int firstA = 0, lastA = m - 1;
		while (firstA < lastA) {

			char temp = c[firstA];
			c[firstA] = c[lastA];
			c[lastA] = temp;
			firstA++;
			lastA--;
		}

		// 再将(m,str.length翻转)
		int firstB = m, lastB = str.length() - 1;
		while (firstB < lastB) {
			char temp = c[firstB];
			c[firstB] = c[lastB];
			c[lastB] = temp;
			firstB++;
			lastB--;
		}

		// 再将字符串全部翻转
		int firstC = 0, lastC = str.length() - 1;
		while (firstC < lastC) {
			char temp = c[firstC];
			c[firstC] = c[lastC];
			c[lastC] = temp;
			firstC++;
			lastC--;
		}

		return new String(c);

	}

}



左旋转字符串