您的位置:首页 > 其它

《leetCode》:Reverse Words in a String

2016-03-13 09:53 267 查看

题目

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 in-place in O(1) space.

click to show clarification.

Clarification:
What constitutes a word?
A sequence of non-space characters constitutes a word.
Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces.
How about multiple spaces between two words?
Reduce them to a single space in the reversed string.


Java实现

用java的思路就比较简单,将字符串按照空格分开,然后倒数构成一个字符串即可。但是有两点需要注意:第一点,应先去掉原字符串的前后的空格,第二点位单词和单词之间可能有几个空格,因此,分开之后的单词可能为空格,因此需要将此过滤掉。

public String reverseWords(String s) {
if(s==null||s.isEmpty()){
return s;
}
s=s.trim();//去掉字符串前后的空格
String[] str=s.split(" ");
StringBuffer sb=new StringBuffer();
for(int i=str.length-1;i>=0;i--){
if(str[i].isEmpty()){//要判断是否为空,因为有可能是空格
continue;
}
if(i==0){
sb.append(str[i]);
}
else{
sb.append(str[i]).append(" ");
}

}
return sb.toString();
}


C实现

用C实现,思路为:两次翻转即可。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
两次翻转即可解决
*/
void swap(char *a,char *b){
char temp=*a;
*a=*b;
*b=temp;
}
void reverse(char *s,int begin,int end){
if(s==NULL||end<=begin){
return;
}
while(begin<end){
swap(&s[begin],&s[end]);
begin++;
end--;
}
}
char *trim(char *s){
if(s==NULL){
return NULL;
}
int begin=0;
int len=strlen(s);
int end=len-1;
while(s[begin]==' '&&begin<len){
begin++;
}
while(s[end]==' '&&end>=0){
end--;
}
if(end<begin){//此种情况说明此字符串全部为空格构成
return "";
}
//把单词之间的多余两个空格的删除掉
int blankCount=0;
int index=begin;//注意:这里是begin
for(int i=begin;i<=end;i++){
if(s[i]==' '){
blankCount++;
}
else{
if(blankCount>1){//填补一个空格
s[index]=' ';
index++;
blankCount=0;//注意清零
}
s[index]=s[i];
index++;
}
}
s[index]='\0';//补一个字符串结束符
return &s[begin];
}

void reverseWords(char *s) {
if(s==NULL){
return ;
}
s=trim(s);
//puts(s);
//  printf("长度为:",strlen(s));
if(s==""){
return;
}
//puts(s);
int len=strlen(s);
//对每个单词进行翻转
for(int start=0;start<len;start++){
if(s[start]!=' '){
int end=start;
while(s[end]!=' '&&end<len){
end++;
}
//这样,start ~end-1就是一个单词
reverse(s,start,end-1);
start=end;//更新start ,但不是start=end+1,因为for循环还会为其加1
}
}
//puts(s);
reverse(s,0,len-1);
}
int main(void){
char s[100];
gets(s);
reverseWords(s) ;
puts(s);
}


由于思路比较明确,但是还是把我给写郁闷了,无论我怎么写,一直不能通过如下的测试用例:





但是我程序中,有对全部是字符串的一个处理方法。但是就是AC不了,哎,郁闷,可能还有某个地方自己没有想到吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: