1.题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
方法一:使用字符串函数split("\\s")分割为字符串数组,然后将数组元素从后向前拼接。
代码实现:
class Solution {
public String ReverseSentence(String str) {
if(str==null||str.trim().length()==0)
return str;
String[] s = str.split("\\s");
StringBuilder sb = new StringBuilder();
for(int i=s.length-1;i>=1;i--){
sb.append(s[i]);
sb.append(" ");
}
sb.append(s[0]);
return sb.toString();
}
}
说明:
1)可能输入可能是多个连续的空格,此时使用trim()函数去掉字符串的首尾空格。
方法二:课本给出的方法,s=“student. a am I”,先将s翻转一次得到"I ma a .tneduts",再将每个单词翻转一次得到"I am a student.".
代码实现:
class Solution {
public String ReverseSentence(String str) {
if(str==null||str.trim().length()==0)
return str;
char[] ch = str.toCharArray();
exch(ch,0,ch.length-1);
int i = 0;
int j = i;
while(i<ch.length&&j<ch.length){
while(j<ch.length&&ch[j]!=' '){
j++;
}
exch(ch,i,j-1);
i = j + 1;
j = i;
}
return String.valueOf(ch); //将字符数组转为字符串
}
public void exch(char[] ch,int i,int j){
for(int k=i;k<=(i+j)/2;k++){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
i++;
j--;
}
}
}
说明:
将字符数组转成字符串数组的函数,String.valueOf(char[] ch);
2.题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
方法一:使用字符串函数拼接方式:例如示例:S="abcXYZdef",K = 3,此时可以使用S.subString(0,n);函数取出前三个字符,再使用S.subString(n,S.length());取出剩下的字符,然后拼在一起。
代码实现:
class Solution {
public String LeftRotateString(String str,int n) {
if(str==null||n<=0||n>=str.length())
return str;
StringBuilder sb = new StringBuilder();
sb.append(str.substring(n, str.length()));
sb.append(str.substring(0, n));
return sb.toString();
}
}
说明:
1)如果左移K位,K大于等于字串的长度,或者K<=0,此时左移后的还是原先的字符串。
2)去子串的函数substring(start,end),包括下标为start的值,不包括下标为end的值。
方法二:s="abcXYZdef",k=3,此时,可以将s分为两部分,第一部分是前面的"abc",后一部分是"XYZdef",首先将"abc"翻转"cbd",然后将"XYZdef"翻转为"fedZYX",就等到到"cbdfedZYX",然后翻转整个字符串得到"XYZdefdbc"。也就是说先部分翻转两次,再一起翻转一次,总共翻转了三次。
代码实现
class Solution{
public String LeftRotateString(String str,int n) {
if(str==null||n<=0||n>=str.length())
return str;
char[] ch = str.toCharArray();
exch(ch,0,n-1);
exch(ch,n,ch.length-1);
exch(ch,0,ch.length-1);
return String.valueOf(ch);
}
public void exch(char[] ch,int i,int j){
for(int k=i;k<=(i+j)/2;k++){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
i++;
j--;
}
}
}