[转]去掉字符串中重复的字符 --- 华为笔试题

转载:http://blog.csdn.net/vincent040/article/details/6902631

题目如题所示,将 “google” 弄成“gole”

// strip.c  

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

#define REDUNDANT -1  

void strip(char *str)  
{  
    if(str == NULL)  
        return;  
    
    int i, j;  
    char *p = str;  
    
    // mark all redundant letters  
    for(i=1; str[i] != '\0'; i++)  
    {  
        for(j=0; j<i; j++)  
        {  
            if(p[j] == str[i])  
            {  
                str[i] = REDUNDANT;  
                break;  
            }  
        }  
    }  
    
    /* 
    ** locate the first redundant letter and 
    ** the first common letter after it. 
    */  
    int redun = 0, common = 0;  
    for(i=1; str[i] != '\0'; i++)  
    {  
        if(str[i] != REDUNDANT)  
            continue;  
    
        redun = i;  
        while(str[i] == REDUNDANT)  
            i++;  
    
        common = i;  
        break;  
    }  
    
    // no repeat letter  
    if(redun == 0)  
        return;  
    
    /* 
    ** move all common letters forward 
    */  
    while(str[common] != '\0')  
    {  
        if(str[common] == REDUNDANT)  
        {  
            common++;  
            continue;  
        }  
        str[redun++] = str[common];  
        str[common++] = REDUNDANT;  
    }  
    
    str[redun] = '\0';  
}  

int main(void)  
{  
    char buf[64];  
    fgets(buf, 64, stdin);  
    
    strip(buf);  
    printf("%s", buf);  
    
    return 0;  
}  



/*这个是我自己实现的,不过标记那部分,还是林老师的比较精辟点*/

#include <stdio.h>

#define FLAG -1

void strip(char *buf)
{
	int i = 0;
	int j = 0;
	int temp = 0;
	
	if (buf == NULL)
		return;
	
	/*标记重复字符*/
	/*
	for (i=0; buf[i] != '\0'; i++)
	{
		for (j=0; buf[j] != '\0'; j++) 
		{
			if (i == j)
			{
				continue;
			}
			else
			{
				if ((buf[i] == buf[j]) && (buf[j] != FLAG))
				{
					buf[j] = FLAG;
				}	
			}
		}		
	}
	*/
	
        /*标记重复字符*/
	for(i=1; buf[i] != '\0'; i++)  
	{  
		for(j=0; j<i; j++)  
		{  
			if(buf[j] == buf[i])  
			{  
				buf[i] = FLAG;  
				break;  
			}
		}  
	}
	
	/*找字符 --> 填坑*/
	for (i=0; buf[i] != '\0'; i++) 
	{
		/*找坑*/
		if (buf[i] != FLAG)
		{
			continue;
		}
		
		/*保存现场*/
		temp = i;
		
		i++;
		
		/*找字符*/
		while (buf[i] == FLAG)
		{
			i++;	
		}
		
		/*开始填坑*/
		if (buf[i] != '\0')
		{
			buf[temp] = buf[i];
			buf[i] = FLAG;
		}
		else	/*提前退出填坑*/
		{
			buf[temp] = '\0';
			return;
		}
		
		/*恢复现场*/ 
		i = temp;
	}
	
	buf[temp+1] = '\0';
} 

int main(void)
{
	char buf[64] = {0};
	
	fgets(buf, 64, stdin);
	
	strip(buf);
	
	printf("%s\n", buf);
		
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值