这道题要基于「力扣」第 189 题的做法才好做出。
方法一:直接模拟
Java 代码:
public class Solution {
// 参考第 189 题:https://leetcode-cn.com/problems/rotate-array/
public String stringShift(String s, int[][] shift) {
// 字符串的问题,需要先转换成字符数组
char[] charArray = s.toCharArray();
int len = s.length();
for (int[] rotate : shift) {
if (rotate[0] == 0) {
rotate(charArray, len - rotate[1]);
} else {
rotate(charArray, rotate[1]);
}
}
return String.valueOf(charArray);
}
private void reverse(char[] charArray, int left, int right) {
while (left < right) {
swap(charArray, left, right);
left++;
right--;
}
}
private void swap(char[] charArray, int index1, int index2) {
char temp = charArray[index1];
charArray[index1] = charArray[index2];
charArray[index2] = temp;
}
public void rotate(char[] charArray, int k) {
int len = charArray.length;
if (len == 0 || k % len == 0) {
return;
}
k = k % len;
// 前 len - k 位反转
// 后 k 位反转
// 整体反转
reverse(charArray, 0, len - k - 1);
reverse(charArray, len - k, len - 1);
reverse(charArray, 0, len - 1);
}
public static void main(String[] args) {
Solution solution = new Solution();
// String s = "abc";
// int[][] shift = {{0, 1}, {1, 2}};
String s = "abcdefg";
int[][] shift = {{1, 1}, {1, 1}, {0,2}, {1,3}};
String res = solution.stringShift(s, shift);
System.out.println(res);
}
}
方法二:左旋转和右旋转可以相互抵消,最终做一次旋转就好了
Java 代码:
public class Solution2 {
public String stringShift(String s, int[][] shift) {
// 字符串的问题,需要先转换成字符数组
char[] charArray = s.toCharArray();
int len = s.length();
int totalShite = 0;
for (int[] rotate : shift) {
if (rotate[0] == 0) {
totalShite -= rotate[1];
if (totalShite < -len){
totalShite += len;
}
} else {
totalShite += rotate[1];
if(totalShite >= len){
totalShite-=len;
}
}
}
// System.out.println(totalShite);
if (totalShite >= 0) {
rotate(charArray, totalShite);
} else {
rotate(charArray, len + totalShite);
}
return String.valueOf(charArray);
}
private void reverse(char[] charArray, int left, int right) {
while (left < right) {
swap(charArray, left, right);
left++;
right--;
}
}
private void swap(char[] charArray, int index1, int index2) {
char temp = charArray[index1];
charArray[index1] = charArray[index2];
charArray[index2] = temp;
}
public void rotate(char[] charArray, int k) {
int len = charArray.length;
if (len == 0 || k % len == 0) {
return;
}
// 非必需
k = k % len;
// 前 len - k 位反转
// 后 k 位反转
// 整体反转
reverse(charArray, 0, len - k - 1);
reverse(charArray, len - k, len - 1);
reverse(charArray, 0, len - 1);
}
public static void main(String[] args) {
Solution2 solution2 = new Solution2();
// String s = "abc";
// int[][] shift = {{0, 1}, {1, 2}};
// String s = "abcdefg";
// int[][] shift = {{1, 1}, {1, 1}, {0, 2}, {1, 3}};
// String s = "wpdhhcj";
// int[][] shift = {{0, 7}, {1, 7}, {1, 0}, {1, 3},
// {0, 3}, {0, 6}, {1, 2}};
String s = "xqgwkiqpif";
int[][] shift = {{1,4},{0,7},{0,8},{0,7},{0,6},{1,3},{0,1},{1,7},{0,5},{0,6}};
String res = solution2.stringShift(s, shift);
System.out.println(res);
}
}