三个简单程序,求更简单更高效的算法

N_Sev7 2011-10-31 01:39:34

/*编写一个函数jsChange(),实现一个英文句子的改写功能,并给出测试程序。
改写条件:扫描句子,以空格或标点符号为分隔符,对句子中所有单词进行倒排,
单词间以空格作为分隔符。*/

#include "stdio.h"
#include "string.h"

char *js_change(char arry[]); /*js_change()函数声明*/

main()
{
char arry[100];
char *str = gets(arry);
str = js_change(arry);
puts(str);

printf("\n");
}


char *js_change(char arry[])
{
int len = strlen(arry);
char * head = (char *)malloc((len)*sizeof(char)); /*动态创建一个用于存放倒排的数组*/
char *end = arry+(len-2); /*尾指针指向最后标点符号的前一位*/
char * temp = NULL; /*中间指针变量*/
char * Cursor = arry+len-1; /*游标*/
int i=0; /*控制循环变量*/
*(head+len) = '\0'; /*为动态数组添加结束符*/

while(i < len)
{

Cursor--;

while(' ' != *Cursor && Cursor >= arry && ',' != *Cursor) /*遍历每一个单词*/
Cursor--;

temp = Cursor; /*记住已遍历的位置*/

while(Cursor < end) /*把遍历到的单词写到创建的动态数组里面*/
{
*(head+i) = *(Cursor+1);
i++;
Cursor++;
}

*(head+i) = ' '; /*空格做为每个单词的分隔符*/
i++;
end = temp-1; /*去掉已遍历到的单词,重置尾指针*/
Cursor = temp; /*恢复已遍历到的位置*/

}
return head; /*返回倒排的句子的首指针*/
}

/*******************************************************************************************/

/*1、 编写一个函数jsSort(),实现一个英文句子排序的功能,并给出测试程序。排序条件:
从字符串中间一分为二,左边部分按字符的ASCII值降序排序,右边部分则升序排序,
如果字符串长度为奇数,则中间字符不参加排序,字符仍放在原位置上。*/

#include "stdio.h"
#include "string.h"

jsSort(char arry[]);

main()
{
char arry[100];

printf("Please enter a sentence:");
gets(arry); /*输入英文句子*/
jsSort(arry); /*调用jsSort函数*/

puts(arry);
printf("\n");

}


jsSort(char arry[])
{
int i = strlen(arry);
char *font = &arry[0]; /*指向句子头的指针*/
char *end = &arry[i-1]; /*指向句子尾的指针*/
char *mind = &arry[(i-1)/2]; /*定义一个指向句子中间的指针*/
char temp; /*用于交换的中间变量*/
char *cursor; /*排序用到的游标*/

/************判断字符串长度奇偶,若为奇数*************/
if(0 != i%2)
{
/*********左半边排序*********/
while(font != mind)
{
cursor=font;
while(cursor != mind)
{
if(*cursor > *font)
{
temp = *cursor;
*cursor = *font;
*font = temp;
}
cursor++;
}
font++;
}
/*********右半边排序********/
font = mind+1;
while(font <= end)
{
cursor=font;
while(cursor <= end)
{
if(*cursor < *font)
{
temp = *cursor;
*cursor = *font;
*font = temp;
}
cursor++;
}
font++;
}

}


/*************若句子长度为偶数*************/
else
{
/************左半边排序**********/
while(font <= mind)
{
cursor=font;
while(cursor <= mind)
{
if(*cursor > *font)
{
temp = *cursor;
*cursor = *font;
*font = temp;
}
cursor++;
}
font++;
}

/***********右半边排序**********/
font = mind+1;
while(font <= end)
{
cursor=font;
while(cursor <= end)
{
if(*cursor < *font)
{
temp = *cursor;
*cursor = *font;
*font = temp;
}
cursor++;
}
font++;
}

}

/* free(font);
free(end);
free(mind);
free(cursor);
*/
}

/***************************************************************************/
/*2、 编写一个函数jsChange(),实现一个英文句子的改写功能,并给出测试程序。
改写条件:扫描句子中的小写字母o,每次将小写字母o的左右字符串部分交叉换位,
即左边字符串移到o的右边,右边字符串反之,并把o删除,
依次直至这一行中的小写字母o处理完。*/

#include "stdio.h"
#include "string.h"

char *jsChange(char arry[]);

main()
{
char arry[100];
char *Str = gets(arry);

Str = jsChange(Str);
puts(Str);
printf("\n");


}

char *jsChange(char *p)
{
char *font = p;
char *head = p;
char *cursor = NULL;
char *temp = NULL;

while('\0' != *font)
{
/*方法一(效率较低)

for(cursor = font;'\0' != *cursor;cursor++)
{


if('o' == *cursor)
{
temp = cursor;
cursor++;
*temp = '\0';

strncat(cursor,head,strlen(head));
head = cursor;
font = head;
break;
}
}*/

/*方法二*/
if('o' == *font)
{
temp = font;
font++;
*temp = '\0';

strncat(font,head,strlen(head));
head = font;
}
font++;
}
return head;

}

以上三个题目是自己做的,但是感觉不是很好,因为要参加一个比赛,能否晋级主要取决于代码的效率,所以想就这几道题请教各位应该如何改进,非常感谢!!!
...全文
195 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
N_Sev7 2011-10-31
  • 打赏
  • 举报
回复
我感觉就是要在程序处理中体现每次遇到o就左右交换吧![Quote=引用 5 楼 nice_cxf 的回复:]

最后一个可以先扫描一遍用链表记住所有o的位置,每次交换后重新计算一下
不过感觉最后结果实际上就是把最后一个o后边的串放到最前边,然后删除所有o
[/Quote]
N_Sev7 2011-10-31
  • 打赏
  • 举报
回复
惭愧惭愧,习惯用冒泡了,受教了[Quote=引用 7 楼 colinfang2006 的回复:]

第二题没什么简单方法,分下奇偶,两边都快排就可以了,你居然用的是冒泡...
[/Quote]
N_Sev7 2011-10-31
  • 打赏
  • 举报
回复
哦,我感觉虽然能够达到同样的效果,但是程序不能体现出来每次遇到o就左右交叉,应该不能满足题目要求吧?![Quote=引用 6 楼 colinfang2006 的回复:]

第三题的结果就是把最后一个o后边的串放到最前边,然后删除所有o
[/Quote]
636f6c696e 2011-10-31
  • 打赏
  • 举报
回复
第一题可以考虑先全部倒叙,然后再根据空格分号分割然后逆序输出,但是我感觉没你那算法好
顶多改良下细节就可以了。
636f6c696e 2011-10-31
  • 打赏
  • 举报
回复
第二题没什么简单方法,分下奇偶,两边都快排就可以了,你居然用的是冒泡...
636f6c696e 2011-10-31
  • 打赏
  • 举报
回复
第三题的结果就是把最后一个o后边的串放到最前边,然后删除所有o
nice_cxf 2011-10-31
  • 打赏
  • 举报
回复
最后一个可以先扫描一遍用链表记住所有o的位置,每次交换后重新计算一下
不过感觉最后结果实际上就是把最后一个o后边的串放到最前边,然后删除所有o
N_Sev7 2011-10-31
  • 打赏
  • 举报
回复
首先谢谢楼上,第一题我确实没有想到用栈,我用的差不多是队列,第二题是不是一定要分奇偶来分开处理呢?至于第三题我没有看太明白楼上的意思,我是每次扫描到o以后调用字符串连接函数,然后再从头扫描的,两种做法,但是有一种感觉很费时![Quote=引用 2 楼 lijy520 的回复:]

手机上的 我看了程序 感觉写的有点冗 最上面看看能不能利用栈的先进后出 第二个排序用快速排序 第三个可用一临时保存第一个o前的 再依次将每一个o后面的前移 最后把这个放最后面
[/Quote]
金元520 2011-10-31
  • 打赏
  • 举报
回复
手机上的 我看了程序 感觉写的有点冗 最上面看看能不能利用栈的先进后出 第二个排序用快速排序 第三个可用一临时保存第一个o前的 再依次将每一个o后面的前移 最后把这个放最后面
金元520 2011-10-31
  • 打赏
  • 举报
回复
手机上的 我看了程序 感觉写的有点冗 最上面看看能不能利用栈的先进后出 第二个排序用快速排序 第三个可用一临时保存第一个o前的 再依次将每一个o后面的前移 最后把这个放最后面
N_Sev7 2011-10-31
  • 打赏
  • 举报
回复
大家都不喜欢看代码么,还是我的编程风格有问题???
希望高手能给指点一下,在此谢过!

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧