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