📅  最后修改于: 2023-12-03 15:28:39.419000             🧑  作者: Mango
本题是“门 | GATE CS Mock 2018”中的第56题,该题属于计算机科学和工程学科,考察考生对C语言的理解和编程实践能力。
编写一个程序,输入一个字符串,如果字符串中出现了重复的字符,将其删除,并输出删除后的字符串。要求删除后的字符串按输入时的顺序保持不变。
#include <stdio.h>
#include <string.h>
void removeDuplicates(char* s) {
int freq[256] = {0};
char* p = s;
int i, j, n = strlen(s);
for(i = 0; i < n; i++) {
if(freq[s[i]] == 0) {
freq[s[i]] = 1;
*p++ = s[i];
}
}
*p = '\0';
}
int main() {
char s[100];
printf("Enter a string: ");
scanf("%[^\n]", s);
removeDuplicates(s);
printf("\nThe string after removing duplicates: %s\n", s);
return 0;
}
程序执行过程:
该程序使用了一个长度为256的数组freq来记录每个字符出现的频次,这能处理ASCII字符集中所有的字符。将freq数组的初始值设置为0,代表每个字符都没有出现过。
然后遍历原始字符串s,当扫描到字符s[i]时,如果freq[s[i]]为0,则代表该字符没有出现过,将其添加到新字符串末尾,并将freq[s[i]]设置为1,代表该字符已经出现过。
程序最后在新字符串末尾添加一个结束符'\0',保证字符串正确终止。
该程序能够正确处理输入的字符串,并删除其中重复的字符。其时间复杂度为O(n),空间复杂度为O(1)。在常规的ASCII字符集中测试,运行时间和空间需求都非常小,能够快速处理大量数据。
[1] 弗吉尼亚大学. (2021). CS3102 Programming Challenges. https://uvacs3102.github.io/programming-challenges/