题目描述:
给定一个字符串,要求将字符串前面的若干个字符移到字符串的末尾。例如,将字符串”abcdef“
的3个字符‘a’、‘b’、'c’移动到字符串的尾部,那么原字符串将变成”defabc“
。请写一个函数实现此功能
解法一:蛮力移位
将需要移动的字符一个一个的移动到字符串的尾部。使用两个方法,leftShiftOne
是将头元素移动到字符串末尾,另一个是调用m次该方法leftShiftOne
。其中m是将m位置之前的元素移动字符串尾部。
public class StringRotating {
public static void leftShiftOne(char[] c) {
char temp = c[0];
for(int i = 1; i < c.length; i++) {
c[i - 1] = c[i];
}
c[c.length - 1] = temp;
}
public static void leftRotatingString(char []a, int m) {
while(m -- != 0) {
leftShiftOne(a);
}
}
public static void main(String[] args) {
char[] a = {'a','b','c','d','e','f'};
leftRotatingString(a,3);
for(char x: a) {
System.out.println(x);
}
}
}
时间复杂度与空间复杂度:针对长度为n的字符串来说,假设需要移动m个字符到字符串末尾,那么总共需要m*n
次操作。同时设立一个变量保存第一个字段。因此,时间复杂度为O(nm),空间复杂度为O(1)
解法二:三步反转
题目既然要求将字符串前面的那部分原封不动地移动到字符串的尾部,那么是否可以把需要移动的部分跟不需要移动的部分分开处理呢?
例如,
- 可以先将一个字符串分割成两个部分,
- 然后将这两个部分的字符串分开反转,
- 最后再对整个字符串进行整体反转,
- 即可解决字符串旋转的问题。
public class StringRotating2 {
public static void leftShiftOne(char[] a, int start,int end) {
while(start < end) {
char temp = a[start];
a[start++] = a[end];
a[end--] = temp;
}
}
public static void leftRotatingString(char []a, int m) {
leftShiftOne(a, 0, m - 1);
leftShiftOne(a, m, a.length - 1);
leftShiftOne(a, 0, a.length - 1);
}
public static void main(String[] args) {
char[] a = {'a','b','c','d','e','f'};
leftRotatingString(a,3);
for(char x: a) {
System.out.println(x);
}
}
}
举一反三——题目1
输入一个英文句子,翻转句子中单词的顺序。要求单词内字符的顺序不变,句子中单词以空格符分开。为了简单起见,标点符号和普通字母一样处理。例如,若“I am a student.”
.则输出“student. a am I”
.
解题思路: 因为要根据空格进行翻转,所以这里要找到空格,空格与前面的单词算一个单词,即"I "
是一起的,翻转后是“ I”
public class StringRotating3 {
//翻转每个单词的
public static void leftShiftOne(char[] a, int start,int end) {
while(start < end) {
char temp = a[start];
a[start++] = a[end];
a[end--] = temp;
}
}
//每个单词的空格处index
public static void leftRotatingString(char []a) {
for(int i = 0; i < a.length; i++){
int start = i;
// 找空格
while(i != a.length && a[i] != ' ')
i++;
if(i != a.length)
leftShiftOne(a, start,i);
else
leftShiftOne(a, start,i - 1);
}
leftShiftOne(a, 0,a.length - 1);
}
public static void main(String[] args) {
char[] a = {'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
leftRotatingString(a);
for(char x: a) {
System.out.print(x);
}
}
}