左旋转字符串
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路
思路一:由题意分析,可以创建一个LinkedList用来存储变化的字符串,再用stringbuilder进行字符串拼接;最后用toString()方法进行格式转换
import java.util.LinkedList;
import java.util.List;
public class Solution {
public String LeftRotateString(String str,int n) {
StringBuilder sb = new StringBuilder();
List<Character> list = new LinkedList<>();
char ss[] = str.toCharArray();
for(int i = 0;i < ss.length;i++){
list.add(ss[i]);
}
while(str.length()== 0 || str == null){
return sb.toString();
}
while(n > 0){
char a = list.remove(0);
list.add(a);
n--;
}
// String message = StringUtils.join("",list);
// return message;
for(int i = 0;i < list.size();i++){
sb.append(list.get(i));
}
return sb.toString();
}
}
方法二:普遍做法
前n位反转,后几位反转,最后总的反转。
注意反转过程的实现,首尾进行交换!
总体来说先反转前n位,再反转后几位,变为了cbafedZYX,再整体反转变为XYZdefabc
public String LeftRotateString(String str,int n) {
if (str == null || str.trim().length() == 0) {
return str;
}
int len = str.length();
n = n % len;// 当len=3,n=4,其实相当于左旋转1位,所以需要取余
char[] charstr = str.toCharArray();
//先旋转前面的
reverse(charstr, 0, n-1);
//再旋转后面的字符串
reverse(charstr, n, len -1);
//最后整体反转
reverse(charstr, 0, len-1);
return String.valueOf(charstr);
}
//实现的是charstrs从i到j的反转,也可以使用上题中stringbuffer的反转方式
private void reverse(char[] charStrs, int i, int j) {
while(i<j) {
char temp = charStrs[i];
charStrs[i] =charStrs[j];
charStrs[j] = temp;
i++;
j--;
}
}
翻转单词顺序列
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路
先使用空格将字符串切分,倒着往stringbuilder里面插入。
public class Solution {
public String ReverseSentence(String str){
String[] ss = str.split(" ");
StringBuilder sb = new StringBuilder();
if (str == null || str.trim().length() == 0) {
return str;
} //注意这个判断非常重要!!!
for(int i = ss.length-1;i >= 0;i--){
if(i==0){
sb.append(ss[i]);
}else{
sb.append(ss[i]+" ");
}
}
return sb.toString();
}
}