剑指Offer:翻转单词顺序 vs 左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内部的顺序不变。为简单起见 ,标点符号和普通字母一样处理。例如输入字符串”I am a student. ”,则输出”student. a am I”。

      这是一道经典的算法题,使用两次翻转即可实现。我们能很顺畅的给面试官解释:第一次对整个字符串进行翻转,得到:“.stneduts a ma I”;第二次对单个字符串进行翻转,得到:“students. a am I”。

实现代码:

private static String ReverseSentence(String sentence){
    if(sentence==null||sentence.length()==0){
        throw new RuntimeException("sentence==null||sentence.length()==0");
    }
    char[] chs = sentence.toCharArray();
    //第一次字符串整体逆序
    Reverse(chs, 0, chs.length-1);

    //第二次对字符串中单个单词进行逆序,单词直接分界就是空格
    int wordStart=0,wordEnd=0;
    char temp=chs[wordEnd];
    while(wordEnd<chs.length){
        if(chs[wordEnd]==' '){
            Reverse(chs, wordStart, wordEnd-1);
            wordEnd++;
            wordStart = wordEnd;
        }
        wordEnd++;
    }
    return new String(chs);
}

private static void Reverse(char[] chs,int left,int right){
    while(left<right){
        char temp=chs[left];
        chs[left]=chs[right];
        chs[right]=temp;
        left++;
        right--;
    }
}

题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串”abcdefg"和数字 2,该函数将返回左旋转 2 位得到的结果”cdefgab”。

      题目二与题目一的关联是比较大的,完成这题我们需要进行三步翻转。以字符串“abcdefg”为例,第一次翻转前2位,即“ab”,得到”bacdefg”;第二次翻转后面的所有字符,得到“bagfedc”;第三次翻转整个字符串,得到“cdefgab”。

实现代码:

private static String LeftRotateString(String str,int n){
    if(str==null||str.length()==0||n<0){
        throw new RuntimeException("str==null||str()==0");
    }
    char[] chs = str.toCharArray();

    Reverse(chs, 0, n-1);
    Reverse(chs,n,chs.length-1);
    Reverse(chs,0,chs.length-1);
    return new String(chs);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值