Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4828453
  • 博文数量: 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;
}

 

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

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

ubuntuer2009-08-24 09:17:35

首先感谢大家的回复!!! bedreaming的想法我赞同... 下面几位的代码,我什么要先遍历一遍str求小写字母数量,我不懂! 不过既然遍历了,何不用个数组B保持是大写还是小写B[i]=0小写, 1大写... 第一个0最后一个1交换!!

wuchangqian5372009-08-23 21:04:40

#include /****************************************** 程序的思想是: 一个字符串中如果有m个字符,其中n个小写字符 则将字符串从 n-1开始,到末尾这一区间中 每个小写字符与首部到n-1的任何一个大写字符交换 ******************************************/ int main(){ /****************************************** tmp:交换字符用到的中间变量。 ary: 在栈上保存的一个待“处理 ”的字符串。 *******************************************/ char tmp , ary[] = "abcaSDEKJANKLADKLoasdfjlasoekleasdALAadlfkajdALDOal"; /****************************************** low : 移动过程中向前(左/低

chinaunix网友2009-08-23 19:11:03

同意bedreaming. 应该用首尾指针好些吧,i从前向后指向第一个大写字母,j从后向前指向第一个小写字母,交换i和j 当i>j时退出.

wuchangqian5372009-08-23 18:58:16

//中间那么多函数调用本身就是对性能最大的浪费 //我觉得我这个比你的要快一点点,,,, #include int main(){ char tmp , ary[] = "aAAadADFaaaaacCAcAacaaaaaaaaaaaaakaasdfasdjkfhaskdjfhaskdjfhajksdfhaksdjfhaskdjhAAAaAAAa"; int volatile len = 0 , split = 0 , low , high; while(ary[len]){ ary[len++] > 'Z' ? split++ : split; } /* 小写字符的个数,和字符总个数 printf("%d \t %d \n" , split , len); */ split = (split << 1) > len ? split : (len - split) ; low = high = --split

ubuntuer2009-08-21 16:10:21

呵呵,这个想法可以看做是对快排的一种改进了....