Chinaunix首页 | 论坛 | 博客
  • 博客访问: 467734
  • 博文数量: 134
  • 博客积分: 3056
  • 博客等级: 中校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 15:53
文章分类
文章存档

2013年(1)

2010年(133)

我的朋友

分类: C/C++

2010-11-04 19:19:27

昨晚参加一个笔试,题目大致的意思是:给一个字符串将其中的'*'字符提到该字符串的前面,而且其他字符的相对顺序不会改变。要求效率尽可能高,临时存储空间尽可能少。 
如:ab**cd**fef**gh12,调整后为:******abcdefgh12。 
我的思路是:两个循环,外循环遍历整个字符串,到外循环遇到'*'时,内循环从外循环+1的位置开始,直至找到第一个非'*'字符,然后二者交换,内循环停止;等外循环遍历完整个字符串,结束。 

自己写了一个,好烂!


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

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

void stringReposition(char *str)
{
    char *i, *j;
    char *tmp;
    int cnt = 0;
    int len = strlen(str);

    for(i = str; *i != '\0'; i++){
        if(*i == '*'){
            /* i='*', j为第一个非'*'的位置 */
            for(j = i+1; *j == '*' && *j != '\0'; j++);
            if(*j == '\0') {
                //i j

                //***** \0

                //cnt为*的个数

                cnt = j - i;
                break;
            }else if(*j != '*'){
                swap(i, j);
            }
            
        }
    }

    /* 上面调整完后会是abcdefgh12******的情况,所以循环右移六个字符即可达到要求 */
    tmp = (char*)malloc(sizeof(char)*cnt);
    memcpy(tmp, str+len-cnt, cnt);
    memcpy(str+cnt, str, len-cnt);
    memcpy(str, tmp, cnt);
    //return str;

    //printf("%s\n", str);

}

int main()
{
    char str[] = "*ab*cd**ef**gh12";

    stringReposition(str);
    printf("%s\n", str);

    return 0;
}


这是人家高手写的代码,好简洁!


#include <stdio.h>
#include <string.h>

void stringAdjust(char *str)
{
    char *p2, *p1;


    p1 = str;
    while(*p1++ != '\0'); /* p1指针指向字符串最后一个字符(空字符, '\0') */
    for(p2 = --p1; p1 >= str; --p1){
        if(*p1 != '*'){
            *p2-- = *p1;
        }
    }
    for(; p2 >=str; --p2){
        *p2 = '*';
    }

}
  
int main()
{
         char p1[] = "**abcd****efg";
         char p2[] = "abcd***efg***";
         char p3[] = "***abcdefg***";
         char p4[] = "abcd******efg";

         stringAdjust(p1);
         printf("%s\n", p1);
  
         
         stringAdjust(p2);
         printf("%s\n", p2);
  
         
         stringAdjust(p3);
         printf("%s\n", p3);
  
         
         stringAdjust(p4);
         printf("%s\n", p4);
         return 0;
  
}


讨论帖见:
1. 
2.

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