剑指offer面试题42_2 左旋转字符串
2017-07-13 15:49
330 查看
主要思想:
将字符串分为两部分,将前n个字符看成第一部分,后面的所有字符看成第二部分,先分别翻转这两部分,最后在翻转整个字符串即可以实现左旋转字符串。
public class Solution {
public String LeftRotateString(String str, int n) {
//还需考虑对n是否大于字符串的长度
if (str == null || str.length() <= 0 || n < 0) {
return "";
}
//防止内存访问越界
if (n > str.length()) {
return str;
}
int length = str.length();
//包括第0位,但不包括第n位
String substring1 = str.substring(0, n);
String subString2 = str.substring(n, length);
char[] charArray1 = substring1.toCharArray();
char[] charArray2 = subString2.toCharArray();
//对charArray1进行翻转
Reverse(charArray1, 0, charArray1.length - 1);
//对charArray2进行翻转
Reverse(charArray2, 0, charArray2.length - 1);
//将两个字符数组进行拼接,在整体翻转
char[] appendCharArray = new char[charArray1.length + charArray2.length];
for (int i = 0; i < charArray1.length; i++) {
appendCharArray[i] = charArray1[i];
}
for (int i = charArray1.length; i < appendCharArray.length; i++) {
appendCharArray[i] = charArray2[i - charArray1.length];
}
Reverse(appendCharArray, 0, appendCharArray.length - 1);
String s = String.valueOf(appendCharArray);
return s;
}
public char[] Reverse(char[] charArray, int begin, int end) {
if (charArray == null) {
return null;
}
while (begin < end) {
char temp = charArray[begin];
charArray[begin] = charArray[end];
charArray[end] = temp;
begin++;
end--;
}
return charArray;
}
将字符串分为两部分,将前n个字符看成第一部分,后面的所有字符看成第二部分,先分别翻转这两部分,最后在翻转整个字符串即可以实现左旋转字符串。
public class Solution {
public String LeftRotateString(String str, int n) {
//还需考虑对n是否大于字符串的长度
if (str == null || str.length() <= 0 || n < 0) {
return "";
}
//防止内存访问越界
if (n > str.length()) {
return str;
}
int length = str.length();
//包括第0位,但不包括第n位
String substring1 = str.substring(0, n);
String subString2 = str.substring(n, length);
char[] charArray1 = substring1.toCharArray();
char[] charArray2 = subString2.toCharArray();
//对charArray1进行翻转
Reverse(charArray1, 0, charArray1.length - 1);
//对charArray2进行翻转
Reverse(charArray2, 0, charArray2.length - 1);
//将两个字符数组进行拼接,在整体翻转
char[] appendCharArray = new char[charArray1.length + charArray2.length];
for (int i = 0; i < charArray1.length; i++) {
appendCharArray[i] = charArray1[i];
}
for (int i = charArray1.length; i < appendCharArray.length; i++) {
appendCharArray[i] = charArray2[i - charArray1.length];
}
Reverse(appendCharArray, 0, appendCharArray.length - 1);
String s = String.valueOf(appendCharArray);
return s;
}
public char[] Reverse(char[] charArray, int begin, int end) {
if (charArray == null) {
return null;
}
while (begin < end) {
char temp = charArray[begin];
charArray[begin] = charArray[end];
charArray[end] = temp;
begin++;
end--;
}
return charArray;
}
相关文章推荐
- [剑指offer][面试题42]翻转单词顺序 VS 左旋转字符串
- 【剑指offer】面试题42:左旋转字符串
- 剑指offer之面试题42翻转单词顺序VS左旋转字符串
- 剑指offer 面试题42 翻转单词顺序 VS 左旋转字符串
- 【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串】
- 【剑指offer】面试题42:单词翻转顺序&左右旋转字符串
- 剑指offer:面试题42——左旋转字符串
- 剑指Offer_面试题42_翻转单词顺序 VS 左旋转字符串
- 【剑指Offer】面试题42:左旋转字符串
- 剑指offer-面试题42-翻转单词顺序VS左旋转字符串
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 【剑指offer】6.3知识迁移能力——面试题42:翻转单词顺序VS左旋转字符串
- 剑指offer——面试题42:(二)字符串的坐旋转操作
- 【剑指offer】面试题42-翻转单词顺序VS左旋转字符串
- 剑指offer面试题[42]-反转单词顺序VS左旋转字符串
- 剑指Offer面试题42:翻转单词顺序;左旋转字符串 Java实现
- 剑指offer-面试题42:翻转单词顺序VS左旋转字符串
- 剑指Offer面试题42(Java版):反转单词顺序VS左旋转字符串
- 剑指offer 面试题42—翻转单词顺序VS左旋转字符串
- 剑指offer_面试题42——左旋转字符串