53.Reverse Words in a String-翻转字符串(容易题)

原创 2016年08月28日 20:12:47

翻转字符串

  1. 题目

    给定一个字符串,逐个翻转字符串中的每个单词。

  2. 说明

    单词的构成:无空格字母构成一个单词
    输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
    如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个

  3. 样例

    给出s = “the sky is blue”,返回”blue is sky the”

  4. 题解

1.先拆分成单词列表,再反转单词列表,最后组成反转后的字符串。

public class Solution {
    /**
     * @param s : A string
     * @return : A string
     */
    public String reverseWords(String s) {
        // write your code
        StringBuilder result = new StringBuilder("");
        ArrayList<String> strList = new ArrayList<>();
        char[] s_char = s.toCharArray();
        StringBuilder tmp = new StringBuilder("");
        for (int i=0;i<s_char.length;i++)
        {
            if (s_char[i] == ' ')
            {
                if (tmp.length() != 0)
                {
                    strList.add(tmp.toString());
                    tmp.setLength(0);
                }
            }
            else
            {
                tmp.append(s_char[i]);
            }
            if (i == s_char.length-1 && tmp.length() != 0)
            {
                strList.add(tmp.toString());
            }
        }
        for (int i=0,j=strList.size()-1;i<j;i++,j--)
        {
            String t = strList.get(i);
            strList.set(i,strList.get(j).toString());
            strList.set(j,t);
        }
        for (int i=0;i<strList.size();i++)
        {
            result.append(strList.get(i));
            if (i != strList.size()-1)
            {
                result.append(" ");
            }
        }

        return result.toString();
    }
}

2.先反转字符串,再分别反转每个单词

public class Solution {
    /**
     * @param s : A string
     * @return : A string
     */
    public String reverseWords(String s) {
        if (s.length() <= 1)
        {
            return s;
        }
        char[] arr = s.toCharArray();
        StringBuilder result = new StringBuilder("");
        reverse(arr,0,s.length()-1);//整体反转
        int start = -1;
        for (int i=0;i<arr.length;i++)
        {
            if (arr[i] == ' ' && start != -1)//查找到单词
            {
                //反转后添加到result
                reverse(arr,start,i-1);
                append(result,arr,start,i-1);
                start = -1;
            }
            else if (arr[i] != ' ')
            {
                start = start == -1 ? i : start;//改变指针位置
                //如果是最后一个字符则判断是否有未反转的单词
                if (i == arr.length-1 && start != -1)
                {
                    reverse(arr,start,i);
                    append(result,arr,start,i);
                }
            }
        }

        return result.length() == 0 ? "" : result.substring(0, result.length() - 1);
    }

    private void append(StringBuilder result,char[] arr,int start,int end)
    {
        for (int i=start;i<=end;i++)
        {
            result.append(arr[i]);
        }
        result.append(" ");
    }

    private void reverse(char[] arr,int start,int end)
    {
        for (int i=start,j=end;i<j;i++,j--)
        {
            char tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    }
}

Last Update 2016.8.28

版权声明:本文为博主原创文章,未经博主允许不得转载。

LintCode(easy)翻转字符串

bug1for (int i = 0; i < s.size(); i++){ //if (s[0] == ' ') s.erase(0, 1); //if (s[s....
  • Jang1996
  • Jang1996
  • 2016年07月26日 11:27
  • 194

LeetCode刷题:Reverse Words in a String(翻转字符串中的单词)

题目 Given an input string, reverse the string word by word. For example, Given s = "the sky ...
  • duqi_2009
  • duqi_2009
  • 2014年07月16日 21:16
  • 836

php实现字符串翻转的方法

提到实现字符串反转的方法,大家都会想到用循环。确实,循环是一个内存占用量小且实现简单的方式。但是还有一种方式可以实现这样的功能,那就是递归。 php支持递归函数,递归函数就是函数调用自己本身。这些函数...
  • Wake_me_Up123
  • Wake_me_Up123
  • 2017年03月22日 10:06
  • 1081

java--让一个字符串反转

描述:给我一个字符串,例如I love java,输出: java love I 方法一 public class StringReverse { public void swap(cha...
  • shenshen123jun
  • shenshen123jun
  • 2013年06月16日 00:26
  • 49314

29.Interleaving String-交叉字符串(中等题)

翻转字符串 题目给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。 样例比如 s1 = “aabcc” s2 = “dbbca”当 s3 = “aadbbcbcac”,返回 tr...
  • Tri_Color_Flag
  • Tri_Color_Flag
  • 2016年09月25日 15:48
  • 282

字符串反转的9种方法

1. 使用Array.Reverse方法 对于字符串反转,我们可以使用.NET类库自带的Array.Reverse方法 public static string ReverseByArra...
  • u013256622
  • u013256622
  • 2017年03月04日 13:03
  • 1779

剑指Offer面试题42:翻转单词顺序;左旋转字符串 Java实现

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符串的顺序不变。例如输入字符串:“I am a student”,则输出“student a am I”. 算法分析: 算法1...
  • gg543012991
  • gg543012991
  • 2016年09月25日 20:20
  • 964

【字符串反转总结】Java中七种方法实现

算法比较简单,注释就能说明问题,直接上代码! 方法一:(利用递归实现) public static String reverse1(String s) { int length = s.len...
  • guomutian911
  • guomutian911
  • 2015年10月05日 10:37
  • 4608

字符串翻转练习—三步翻转法

文章出处:github 题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串...
  • u010016196
  • u010016196
  • 2015年04月19日 10:12
  • 1527

iOS Category翻转字符串

开发过程中写了分类翻转字符串 下面我给大家详细介绍下。 一. 分类的作用?  分类的意思是在不改变原来的类内容的基础上,为类增加一些方法。 二. 翻转字符串是的意思是 ? 例:(123456)转成...
  • WANGYURUI_wyr
  • WANGYURUI_wyr
  • 2016年10月14日 13:53
  • 625
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:53.Reverse Words in a String-翻转字符串(容易题)
举报原因:
原因补充:

(最多只允许输入30个字)