随笔 - 89  文章 - 118  trackbacks - 0
<2013年9月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

留言簿(16)

随笔分类(56)

随笔档案(89)

文章分类

推荐博客

搜索

  •  

最新随笔

最新评论

阅读排行榜

将字符串里词顺序倒置,如"Times New Roman"变为"Roman New Times"。以空格为分隔符。

解决方案为:先将整个字串倒置,然后依次把倒置后串中的每一个单词倒置。

这个问题解答的思路很简单,但是要考虑到很多种的情况,比如字符串的头、尾有多余的空格怎么办,如果字符串中只有空格,还有字符串中间可能会有两个以上并列的空格。

程序如下:

 1 void ReverseStr(char *pStr, int len)
 2 {
 3     assert(pStr);
 4     
 5     char ch;
 6     for (int i = 0; i < len/2 ; i++)
 7     {
 8         ch = pStr[i];
 9         pStr[i] = pStr[len-1-i];
10         pStr[len-1-i] = ch;
11     }
12 }
13 
14 void ReverseStrWord(char *pStr, int len)
15 {
16     assert(pStr);
17 
18     if (len <= 1)
19         return;
20 
21     // 倒置整个字符串
22     ReverseStr(pStr, len);
23 
24     // 处理头多余的空格
25     int i = 0;
26     if (pStr[0== ' ')            while (pStr[i] == ' ' && i < len)        i++;
27 
28     // 整个串都是空格
29     if (i == len)
30         return;
31 
32     // 处理尾多余的空格
33     if (pStr[len - 1== ' ')    while (pStr[len - 1== ' ' && len - 1 > 0)    len--;
34 
35     for (int start = i; i < len; i++)
36     {
37         // 最后的end要+1
38         if (i == len-1)
39         {
40             ReverseStr(pStr+start, i-start+1);
41             break;
42         }
43 
44         // 倒置一个单词
45         if (pStr[i] == ' ')
46         {
47             ReverseStr(pStr+start, i-start);
48             start = i+1;
49             // 处理内部并列的空格
50             if (pStr[start] == ' ')
51             {
52                 while(pStr[start] == ' ') {i++;start++;};
53             }
54         }
55     }
56 }
57 

 

说实话,如果是突然面对这样一个问题,要在一张纸上写下比较完整的程序是不大可能。能边调试边写程序有的时候也是一件幸事。
中秋节要到了,我要换工作了,告别已经工作两年多熟悉的环境,感觉这两年没有太大的进步,奋斗吧,趁着自己还年轻!

posted on 2008-09-12 20:42 胡满超 阅读(2219) 评论(5)  编辑 收藏 引用

FeedBack:
# re: 将字符串里词顺序倒置 2008-09-13 13:39 独履_天涯
楼主现在做什么工作啊,不知道要换什么工作啊?  回复  更多评论
  
# re: 将字符串里词顺序倒置 2008-09-14 22:00 胡满超
现在在一家公司做程序员,换到另外一家还做程序员,呵呵。  回复  更多评论
  
# re: 将字符串里词顺序倒置 2009-01-09 15:36 yych13
用JAVA解决可能简单一些:
public void reverseString(String str, String regx) {

String[] split = str.split(regx);
int last = split.length - 1;
StringBuffer result = new StringBuffer();
for (int i = last; i > 0; i--) {
result.append(split[i]);
result.append(regx);
}
result.append(split[0]);
System.out.println(result.toString());
}  回复  更多评论
  
# re: 将字符串里词顺序倒置 2009-02-18 17:14 qingfly
根据这个思路我用PHP使用
<?php
//字符串反置
function ReverseStr (&$str, $len){
$i = 0;
for($i; $i < $len; $i++,$len--){
$ch = $str[$i];
$str[$i] = $str[$len];
$str[$len] = $ch;
}
}

function ReverseStrWord ($word, $len){

if($len == 1) return ;

//倒置全部字符串
ReverseStr(&$word, $len);

//去除字符串前的空格
$i = 0;
if($word[0] == ' ') {
while ($word[$i] == ' ' && $i < $len) {
$i++;}
}

//全是空格返回
if($i == $len) return ;

//去除尾部空格
if($word[$len] == ' ') {
while ($word[$len] == ' ' && $len > $i) {
$len--;}
}

for($start = $i; $i <= $len; $i++ ){

$str .= $word[$i];

if($i == $len){
ReverseStr($str, $i-$start+1);
$R_string .= $str;
break;
}

if($word[$i] == ' '){
ReverseStr($str, $i-$start);
$R_string .= $str;
$str = '';
$start = $i+1;
if($word[$start] == ' '){
while ($word[$start] == ' ') {
$start++;
$i++;
}
}
}
}
return $R_string;
}


$str = "Times New Roman";
$len = strlen($str);
$pstr = ReverseStrWord($str, $len);

?>
  回复  更多评论
  
# re: 将字符串里词顺序倒置 2012-03-19 15:50 张更伟
void inverse(char *p1, char *p2)
{
if (0 == p1 || 0 == p2) return;
while (p1 < p2)
{
char c = *p1;
*p1++ = *p2;
*p2-- = c;
}
}

char* inverse(char * const s)
{
if (0 == s) return s;
const int n = strlen(s);
inverse(s, s + n -1);

char *p1 = s - 1;
char *p2 = p1;

while(++p2 < s + n)
{
if (*p2 == ' ')
{
inverse(p1 + 1, p2 - 1);
p1 = p2;
}
}

inverse(p1 + 1, p2 - 1);
return s;
}
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理