【剑指 Offer 题解】58.2 左旋转字符串

题目

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

示例

Input:
S="abcXYZdef"
K=3

Output:
"XYZdefabc"

思路

1、直接解决,将字符串分割为两个字串,交换两个字串的顺序(但该方法占用内存空间较大)。

public String LeftRotateString(String str,int n) {
	if (str == null || str.length() <= n)
		return str;
	String s1 = str.substring(0, n);
	String s2 = str.substring(n);
	return s2 + s1;
}

2、结合【剑指 Offer 题解】58.1 翻转单词顺序列 ,扩展本题

  • 将本题的输入 “abcXYZdef”,3 看作由题目58.1 的输入"abc XYZdef"
  • 先将 “abc” 和 “XYZdef” 分别翻转,得到 “cbafedZYX”,然后再把整个字符串翻转得到 “XYZdefabc”
public String LeftRotateString(String str,int n) {
    if (str == null || str.length() <= n)
        return str;
    char[] chars = str.toCharArray();
    reverse(chars, 0, n - 1);
    reverse(chars, n, str.length() - 1);
    reverse(chars, 0, str.length() - 1);
    return new String(chars);
}
private void reverse(char[] chars, int start, int end) {
    for (int i = start,j = end; i < j; i++, j--) {
        swap(chars, i, j);
    }
}
private void swap(char[] chars, int i, int j) {
    char temp = chars[i];
    chars[i] = chars[j];
    chars[j] = temp;
}
发布了18 篇原创文章 · 获赞 0 · 访问量 492

猜你喜欢

转载自blog.csdn.net/qingqingxiangyang/article/details/104416305