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--; } } }