首页 > 代码库 > 左旋转字符串
左旋转字符串
- 题目描述:
- 汇编语言中有一种移位指令叫做循环左移(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); } }
左旋转字符串
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。