📜  门| GATE CS Mock 2018 |设置 2 |第 56 题(1)

📅  最后修改于: 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的数组,用来记录每个字符出现的频次;
  • 然后定义一个指针p,用来指向新字符串的末尾;
  • 循环遍历原始字符串,如果字符没有出现过,则将其加入新字符串末尾,并记录该字符出现过;
  • 最后在新字符串末尾添加一个结束符'\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/