zoukankan      html  css  js  c++  java
  • (面试题)删除在另一个字符串中出现的字符

    题目:

    输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

    思路:

    通过hash表记录第二个字符串中出现的字符,hash表可以由长度为256的bool数组表示。

    然后遍历第一个字符串,每扫描一个字符,通过检查hash表判断该字符是否在第二个字符串出现过,如果是,则删除,否则继续。

    那么如果在字符串中删除字符呢?一般而言,每删除一个字符,后面的字符必须往前移,如果每个字符都需要这么操作的话,复杂度就很高了。

    解决办法:通过两个指针,一个用于遍历字符串pFast,一个用于删除字符pSlow,当pFast指针所指字符没有在第二个字符串出现过,则*pSlow=*pFast,pSlow++,即保留该位置的字符,否则,pSlow不变,当遍历完字符串之后,*pSlow='',以表示删除字符后的新字符串。

    代码:

    #include <iostream>
    
    using namespace std;
    
    void deleteChars(char* str1,char* str2){
        if(str1==NULL || str2==NULL)
            return;
        const int tableSize=256;
        bool hashTable[tableSize];
        for(int i=0;i<tableSize;i++)
            hashTable[i]=false;
        //memset(hashTable,0,sizeof(tableSize));
    
        int index;
        while(*str2!=''){
            if(*str2>=0)
                index=*str2;
            else
                index=*str2+256;
            hashTable[index]=true;
            str2++;
        }
    
        char* pSlow=str1;
        char* pFast=str1;
        while(*pFast!=''){
            if(*pFast>=0)
                index=*pFast;
            else
                index=*pFast+256;
            if(!hashTable[index]){
                *pSlow=*pFast;
                pSlow++;
            }
            pFast++;
        }
        *pSlow='';
    }
    
    int main()
    {
        char str1[] = "They are students";
        char str2[] = "Tt";
        deleteChars(str1,str2);
        cout<<str1<<endl;
        return 0;
    }
  • 相关阅读:
    反反爬 | 如何巧过 CloudFlare 5秒盾?
    Xpath高级用法
    GZIP 头解析
    学习S5
    Chrome 建立SOCKS5代理
    建立IP6隧道
    linux 配置Socks51
    linux 配置Socks5
    最近买了一个域名 哈哈,棒棒哒~~
    jquery 动态添加下拉框 需要增加 煊染 selectmenu("refresh");
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4676608.html
Copyright © 2011-2022 走看看