20211115笔试复盘

134 阅读2分钟

平台:Codility
语言:c++
三个task
1、实现数据库的增改
2、二分法找bug(s)只允许改三行
3、实现一个迭代器
重点回顾第三个问题
需要实现以下接口,最后这个迭代器能实现遍历输出
输入是从文本读出的内容,文本中每一行都有内容,包含各种合法字符,需要我们从每一行里面找出是否有数字,把数字存起来。文件长得可能如下

+++3
--2

1,200
2-3
1234 其中只有第一行,第二行和最后一行是有效数字那么输出应该是{3,-2,1234}

class Solution{
    public:
    Solution(istream& s);
    class iterator{
    };

    iterator begin(){return iterator(&m_data[0]);}
    iterator end(){return iterator(&m_data[m_size]);}
};

以下是解答的代码,完成的功能写在main()里面

#include <fstream>
#include <string>
using namespace std;

class Solution{
    public:
    int getInteger(string s){
        enum InputType{
            invalid,space,positive,negative,number
        };

        int trans[4][5]={
            -1,0,1,2,3,
            -1,0,1,-1,3,
            -1,0,-1,-1,3,
            -1,0,-1,-1,3,
        };
        int state = 0;
        const char* tmp = s.c_str();
        int numStore = 0;
        while(*tmp!='\0'){
            InputType inputType = invalid;
            if(*tmp == ' ')
                inputType = space;
            else if(*tmp=='+')
                inputType = positive;
            else if(*tmp=='-')
                inputType = negative;
            else if(isdigit(*tmp)){
                inputType = number;
                numStore = numStore*10 + (*tmp)-'0';
            }else
                inputType = invalid;
            
            state = trans[state][inputType];
            if(state ==-1) return INT_MAX;
            tmp++;
        }
        return numStore;
    }

    
    Solution(istream& s){
        string line;
        while(getline(s,line)){
            int tmp=getInteger(line);
            if(tmp!=INT_MAX){
                m_data[m_size]=tmp;
                m_size+=1;
            }
        }
    }
    class iterator
    {
        using iterator_category= std::forward_iterator_tag;
        using difference_type=std::ptrdiff_t;
        using value_type=int;
        using pointer = int*;
        using reference = int&;
        public:
        explicit iterator(pointer ptr):m_ptr(ptr){}
        reference operator*() {return *m_ptr;}
        pointer operator->() { return m_ptr;}
        iterator& operator++() {m_ptr++;return *this;}
        iterator operator++(int) {iterator retval=*this;++(*this);return retval;} 
        friend bool operator==(const iterator& a, const iterator& b) {return a.m_ptr==b.m_ptr;}
        friend bool operator!=(const iterator& a, const iterator& b) {return a.m_ptr!=b.m_ptr;}

        private:
        pointer m_ptr;
    };

    iterator begin(){return iterator(&m_data[0]);}
    iterator end(){return iterator(&m_data[m_size]);}

    private:
    int m_data[200];
    int m_size=0;
};

std::ostream& operator<<(std::ostream& out, Solution::iterator& iter){
    out<< *iter;
    return out;
}

int main(){
    std::filebuf in;
    if(!in.open("D:/05_Code/09_C_Code/Interview/testverb.txt",std::ios::in)){
        std::cout<<"open file failed!"<<endl;
    }

    std::istream iss(&in);

    Solution s(iss);

    for(Solution::iterator it=s.begin();it!=s.end();it++){
        std::cout<< *it <<endl;
    }
}