面试题42:翻转单词顺序VS左旋转字符串

来源:互联网 发布:高中物理网络课程 编辑:程序博客网 时间:2024/05/17 02:16

一、翻转单词顺序

首先反转字符串,然后再反转字符串中的每一个子字符串。

public class Solution {    public String ReverseSentence(String str) {        if(str.length()==0||str.isEmpty()) return str;        char[] chars=str.toCharArray();        reverse(chars,0,chars.length-1);                int start=0,end=0;        for(int i=0;i<chars.length;i++){            if(chars[i]==' '){                end=i-1;//指向前一个非空格子母                reverse(chars,start,end);                start=i+1;            }        }        reverse(chars,start,chars.length-1);//翻转最后一个单词        return new String(chars);//由chars构造一个String返回    }        public void reverse(char[] chars,int start,int end){        while(start<end){            char temp=chars[start];            chars[start]=chars[end];            chars[end]=temp;            start++;            end--;        }    }}
二、左旋转字符串

贴一个效率非常高而且不容易出错的方法,通过reverse操作,我是在看《编程珠玑》的时候里面提到过的:一个序列abcdefg,如果向左循环移动n位,例如3位,则会编程(defg)(abc),我们把原序列分成两部分,A=(abc),B=(defg),原序列为AB,我们要的结果为BA,则可以这么做:(ArBr)r = ((B)r)r((A)r)r=BA
假设原序列有n位,循环左移i位的过程如下:
(1)reverse(0,i-1);
(2)reverse(i,n-1);
(3)reverse(1,n-1);
例如原序列:abcdefg,循环左移3位:
(1) cba defg
(2)cba gfed
(3) defgabc
public class Solution {    public String LeftRotateString(String str,int n) {        if(str.length()==0||str.isEmpty()||n<1)            return str;        char []chars=str.toCharArray();        reverse(chars,0,n-1);        reverse(chars,n,chars.length-1);        reverse(chars,0,chars.length-1);        return new String(chars);    }     public void reverse(char[] chars,int start,int end){        while(start<end){            char temp=chars[start];            chars[start]=chars[end];            chars[end]=temp;            start++;            end--;        }    }}



阅读全文
0 0
原创粉丝点击