Leetcode里面关于字符串的一些问题,描述如下:

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

Update (2015-02-12):
For C programmers: Try to solve it inO(1) space.

click to show clarification.

Subscribe to see which companies asked this question

解决方案如下:

import java.util.*;
import java.io.*;
import java.lang.*; public class ReverseWords { public String reverseWords(String s) {
StringBuilder reversed = new StringBuilder(); //构建一个空的字符串构建器
int j = s.length();
for (int i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == ' ') {
j = i;
}
         else if (i == 0 || s.charAt(i - 1) == ' ') {
if (reversed.length() != 0) { //当输入只有一个字符的时候,如"a",这时候程序会运行到这一步,但注意此时构建器是没有内容的,因而reversed.length()为0,不满足条件
reversed.append(' '); // 空格也要输进去,但同时要避免两端是空格的情况,那时候是不要输入的。
}
reversed.append(s.substring(i, j)); // 注意此处,运用了字串substring,这个和我之前的想法是一致的,即连接在一起的字符串用substring截取下来。这里,截取下来后放入字符串构建器中
} // substring(int i,int j) 返回一个新字符串,这个新字符串包含原始字符串中的位置从i~j-1的部分,注意下标不包括j
}
return reversed.toString(); // 注意这才是字符串构建器的正确输出格式,返回的是一个与构建器(或称为缓冲器)内容相同的字符串
}
/*
private String ReWords(String s) {
String B=" ";
for(int i=0;i<s.length();i++)
{
//for(int j=i;s.charAt(j)!="";j++);
int j=i;
while(Character.isLetter(s.charAt(j))&&(j<s.length()))j++;
String A=s.substring(i,j);
B=A+B;
i=j;
}
return B;
}
*/
public static void main(String[] args){ ReverseWords Reverse = new ReverseWords();
String out_target=Reverse.reverseWords("ab cac cc");
System.out.printf("the output is "+out_target);
System.out.println();
}
}

总结:注释掉的部分,是我自己的思路,但是行不通,主要体现在:我是采用字符串连接的方式解决这个问题的,这样每次连接字符串都会产生一个心结的String对象,既耗时又浪费空间。并且,思路有点混乱。

cleancode 采用了StringBuilder类,这样就可以避免上诉的问题。可以认真阅读StringBuilder类中的相关内容,可以发现是很适合解决这个问题的。

解决上述问题,相当于用两个标志,两个标志之间就是一个单词,然后从后向前看,首先判断当前的是不是空格,如果是,则把两者定位在空格处(这时候i--,而j不用动,substring()的特性),如果当前不是空格,则判断当前的是字母的下一位

是不是空格,如果是则在字符串构建器末尾加空格(此处的i==0的判断,主要是和里面的判断一起用的,以防止只有一个字母的时候),如果上面条件都不满足,那么就把当前的字母加入到字符串构建器中。

Leetcode 详解(ReverseWords)的更多相关文章

  1. 由Leetcode详解算法 之 动态规划(DP)

    因为最近一段时间接触了一些Leetcode上的题目,发现许多题目的解题思路相似,从中其实可以了解某类算法的一些应用场景. 这个随笔系列就是我尝试的分析总结,希望也能给大家一些启发. 动态规划的基本概念 ...

  2. Leetcode 详解(股票交易日)(动态规划DP)

    问题描述: 在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行).给出一天中的股票变化序列,请写一个程序计算一天可以获得 ...

  3. Leetcode详解Maximum Sum Subarray

    Question: Find the contiguous subarray within an array (containing at least one number) that has the ...

  4. Leetcode 详解(Substing without repeats character)

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  5. Leetcode 详解(Valid Number)

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  6. Leetcode 详解(Implement strstr)

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  7. Leetcode 详解(valid plindrome)

    Question: Given a string, determine if it is a palindrome, considering only alphanumeric characters ...

  8. The Skyline Problem leetcode 详解

    class Solution { public: vector<pair<int, int>> getSkyline(vector<vector<int>&g ...

  9. LeetCode(42.接雨水)多解法详解

    接雨水解法详解: 题目: 基本思路:从图上可以看出要想接住雨水,必须是凹字形的,也就是当前位置的左右两边必须存在高度大于它的地方,所以我们要想知道当前位置最多能存储多少水,只需找到左边最高处max_l ...

随机推荐

  1. [密码学] C++ 实现 AES128 加密算法

    概述 清理邮箱的时候翻出来的. 很久以前写的,理解加密算法用的,当时记得是还撸了两天晚上撸出来的代码,放上来留个纪念好啦. 补上Tutorial,就当考古吧. 写代码时候毕竟年轻,问题也不少,但现在这 ...

  2. laravel框架总结(九) -- 软删除

    当模型被软删除时,它们并不会真的从数据库中被移除.而是会在模型上设置一个 deleted_at 属性并将其添加到数据库.如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空. ...

  3. jquery.Huploadify 上传

    html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  4. 20161127-monkey

    1.配置好adt-bundle-windows-x86-20131030 2.设置环境变量

  5. 没人能阻止你,除了你自己——Keep up the good work!

    今天在网上搜索一些关于计算机专业的论坛或者博客,于是发现了博客园,就进来了.我想把我的一些关于计算机科学与技术领域的学习经历纪录在此,以便于能和大家一起分享,一起努力,一起进步.说实话我是临床医学专业 ...

  6. 什么是原生的javascript

    在www.cocos.com的cocos2d-js的介绍中写道“Cocos2d-JS 是跨全平台的游戏引擎,采用原生JavaScript语言,可发布到包括Web平台,iOS,Android,Windo ...

  7. Linux C相关基础

    系统求助 man 函数名 man 2 函数名    -    表示函数是系统调用函数 man 3 函数名    -    表示函数是C的库函数     eg:man fread     man 2 w ...

  8. JAVA 1.8 理解面向对象程序设计

    1. break语句:经常用在循环语句中,用于跳出整个循环,执行循环后面的代码. 2. continue语句:经常用在循环语句中,用于跳出当前的这个循环(或者是跳出本次循环),开始下一次循环的执行. ...

  9. 生成yyMMddHHmmssSS时间戳代码作为唯一主键值

    import java.sql.Time; import java.text.DateFormat; import java.text.ParseException; import java.text ...

  10. Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解.[size=1.8em]Handler+Runna ...