《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不了,哎,郁闷,可能还有某个地方自己没有想到吧
相关文章推荐
- 添加选项卡页(Ribbon Tab)和面板(Panel)
- JavaScript模拟鼠标事件
- HDU1280前m大的数creat at 9:51,3.13,2016
- Java泛型:泛型类、泛型接口和泛型方法
- java jar
- 缺页中断
- 程序内存分配
- 64位Ubuntu中C与intel汇编混合编程
- 移动web开发问题集
- 使用 flask-mail 扩展发送邮件
- 学习进度条(二)
- 饭后九”不”
- C/C++之FILE文件流的中fopen、fread、fseek、fclose的使用
- Leetcode:88. Merge Sorted Array(JAVA)
- 定义泛型接口
- CentOS7卸载KDE桌面(转)
- js checkbox获取选中的值
- 线性代数复习七——特征向量
- 忽视早餐,轻视生命!
- Oracle11g,在SQL Developer里新建连接时出现错误(已解决)