Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4828550
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-18 16:56:58

   有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大or小写之间不要求保持原来的次序),如有可能尽量选择时间和空间效率高的算法
    一看到这个特别是括号的条件,我的第一反应就是快排那个思路....
  

#include <stdio.h>
#include <stdlib.h>

#define MAX 50

int is_lowercase(char a)
{
   if(a>='a'&&a<='z')
     return 1;
     
   return 0;
}

void swap(char* a, char* b)
{
  char tmp = *a;
  *a = *b;
  *b = tmp;
}

char* change_a_before_A(char* str)
{
  int i = 0;
  int j = -1;
  int len = strlen(str);
  
  for(; i<len; i++)
   {
    if(is_lowercase(str[i]))
     {
       j++;
       swap(str+j,str+i);
     }
  }
}

int main(int argc, char *argv[])
{
  char str[MAX] = "aBDErekrkDSLKHDAsaa";
  
  printf("the original str:\n%s\n",str);
  
  change_a_before_A(str);
  printf("after the str:\n%s\n",str);
    
  system("PAUSE");    
  return 0;
}

 

 应该没有比这个用更少的时间和空间的了

阅读(1353) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

bedreaming2009-08-21 15:03:58

看了一下,你有没有考虑change_a_before_A的循环中经常会进行无谓的swap?比如当str[0]是小写时,执行了swap(str[0],str[0]),而且有的大写字母要经过多次交换才能排到后面。 这种写法效率太低了,采用首尾指针的方法要好得多。

ubuntuer2009-08-21 12:41:58

不太懂阁下意思,个人看了下你这样是有问题的!!! 望详解. aBcd j=-1,i=0 str[0]是小写,j==i-1不换 j=-1,i=2 str[2]是小写,j!=i-1换 j++, str[0]和str[2]交换 无意义!!!!! 个人觉得你的要是对的,快排这个经典的东西也要重写了^_^ 不知道我理解的对不

chinaunix网友2009-08-21 11:47:08

还可以优化啊,if (is_lowercase(str[i]) && j != i - 1)