【剑指offer】58.2 左旋转字符串

99 阅读2分钟

题目描述

在这里插入图片描述 在这里插入图片描述

// 58.2 左旋转字符串


// 力扣
// 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
// 请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcde
// fg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。


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



题解

StringBuilder辅助法

/////////////////////////// StringBuilder辅助法 ////////////////////
// 使用StringBuilder会让这题变得异常简单


// 力扣
// 就是字面意思,以n为分界,n以前的元素移动到后面
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38.4 MB, 在所有 Java 提交中击败了19.52%的用户
class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder();
        String a = s.substring(0, n);
        String b = s.substring(n, s.length());
        res.append(b).append(a);
        return res.toString();
    }
}



// 牛客
// 跟力扣一样,但是多了一个特殊情况排查
// 运行时间:12ms,超过89.64%用Java提交的代码
// 占用内存:9744KB,超过8.61%用Java提交的代码
public class Solution {
    public String LeftRotateString(String s,int n) {
        if (n <= 0 || n >= s.length())
            return s;
        StringBuilder res = new StringBuilder();
        String a = s.substring(0, n);
        String b = s.substring(n, s.length());
        res.append(b).append(a);
        return res.toString();
    }
}

字符操作法

/////////////////////////////// 字符操作法 /////////////////////////


// 力扣
// 以n为界,翻转前半部字符顺序,再翻转后半部字符顺序,
// 最后整个字符组翻转顺序,返回即可。
// 执行用时:2 ms, 在所有 Java 提交中击败了41.86%的用户
// 内存消耗:38.4 MB, 在所有 Java 提交中击败了30.67%的用户
class Solution {
    public String reverseLeftWords(String s, int n) {
		if (n <= 0 || n >= s.length())
            return s;
		char[] chars = s.toCharArray();
		reverse(chars, 0, n - 1);
		reverse(chars, n, s.length() - 1);
		reverse(chars, 0, s.length() - 1);
		return new String(chars);
    }
	
	// 翻转函数reverse
	// 左右双指针left right分别指向字符组char[] chars的头尾,
	// 左右指针索引的元素调用交换位置函数swap,之后左指针右移left++
	// 右指针左移right--,重复交换操作,可以把chars翻转。
	private void reverse(char[] chars, int left, int right) {
		while (left < right) 
			swap(chars, left++, right--);
	}
	
	// 交换位置函数
	private void swap(char[] chars, int i, int j) {
		char temp = chars[i];
		chars[i] = chars[j];
		chars[j] = temp;
	}
}



// 牛客
// 运行时间:12ms超过89.64%用Java提交的代码
// 占用内存:9820KB超过5.40%用Java提交的代码
public class Solution {
    public String LeftRotateString(String s,int n) {
        if (n >= s.length() || n <= 0)
            return s;
        char[] chars = s.toCharArray();
        reverse(chars, 0, n - 1);
        reverse(chars, n, s.length() - 1);
        reverse(chars, 0, s.length() - 1);
        return new String(chars);
    }
    
    private void reverse(char[] chars, int left, int right) {
        while (left < right)
            swap(chars, left++, right--);
    }
    
    private void swap(char[] chars, int i, int j) {
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
}