标签:style color os java ar strong 数据 问题 on
对应每个测试案例,输出新序列。
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); } }
标签:style color os java ar strong 数据 问题 on
原文地址:http://blog.csdn.net/shiyeqiangldh/article/details/39553493