腾讯一面试题,采用冒泡排序的思想,大写字母向后移动,小写字母向前移动,时间复杂度为O(N^2)。
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char str[100]; while (scanf("%s", str) != EOF) { int n, j; int nLen = strlen(str); for (int i = nLen - 1; i > 0; i--) { if (islower(str[i])) { j = i; while(islower(str[j]) && j >= 1) { j--; } if (j == 0 && islower(str[j])) { break; } if (isupper(str[j])) { char temp = str[j]; for (int k = j; k < i; k++) { str[k] = str[k + 1]; } str[i] = temp; } } } printf("%s\n", str); } return 0; }
http://www.cnblogs.com/lzmfywz/archive/2013/08/31/3293266.html
这里有一种更为简洁的方法:
- /**
- ** author :hackbuteer
- ** date :2012-10-03
- **/
- void Arrange(char *str , int n)
- {
- int i , k = n-1;
- for(i = n - 1 ; i >= 0 ; --i)
- {
- if(str[i] != '*')
- {
- if(str[k] == '*')
- {
- str[k] = str[i];
- str[i] = '*';
- }
- --k;
- }
- }
- }
结合运行结果,最后一个数字是k值的变化,思路就是遇到*就不让k减,并且i减,然后遇到非*则与最后一个*交换然后k减,这样每次都让最后一个*与向左遍历的第一个非*交换