-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathQ1-3.CPP
85 lines (79 loc) · 1.55 KB
/
Q1-3.CPP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/***********************************************
题目描述:
移除字符串中重复的字符,如abcadc移除后变为abcd,
可以额外定义一两个变量,但不允许额外开辟一个数组,
并为该算法写测试用例
Date:2014-03-16
************************************************/
#define MAX 26
#include<stdio.h>
#include<string.h>
void remove(char *str)
{
int len = strlen(str);
if(len < 2)
return ;
int i,j;
int p = 0; //p的初值与i相等,均为0
for(i=0;i<len;i++)
{
//如果该字符不为'\0',则与下面的字符比较
if(str[i])
{
//如果当前字符不为'\0'时,p一直与i相等,
//如果当前字符为'\0',则p会小于i,从而用后面的字符来填充前面'\0'字符的位置
str[p++] = str[i];
//每个字符与其后面的字符比较,
//如果出现重复字符,则将后面的重复字符用'\0'代替
for(j=i+1;j<len;j++)
if(str[i] == str[j])
str[j] = '\0';
}
}
str[p] = '\0';
}
/*
开辟长为26的bool数组的方法
*/
void remove1(char *str)
{
int len = strlen(str);
if(len < 2)
return ;
int i;
int p = 0;
bool A[MAX];
memset(A,0,sizeof(A));
for(i=0;i<len;i++)
{
int index = str[i] - 'a';
if(!A[index])
{
str[p++] = str[i];
A[index] = true;
}
}
str[p] = '\0';
}
int main()
{
char str1[] = "abcdfbdk"; //随机字符串
char str2[] = "abababab"; //重复字符交替出现
char str3[] = "aaaabbbb"; //重复字符连续出现
char str4[] = "aaaaaaaa"; //全是重复字符
char str5[] = "abcdefgh"; //没有重复字符
char str6[] = ""; //空字符串
remove1(str1);
remove1(str2);
remove1(str3);
remove1(str4);
remove1(str5);
remove1(str6);
puts(str1);
puts(str2);
puts(str3);
puts(str4);
puts(str5);
puts(str6);
return 0;
}