面试题58 翻转字符串

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


猜你喜欢

转载自blog.csdn.net/chenkaibsw/article/details/80674898
今日推荐