题目见:
http://community.youkuaiyun.com/Expert/TopicView3.asp?id=5011617
1 ATGACAATTGAGGATCTTATTTCTTCGGAGACA--------------------
2 ATGACAATTGA---------------------------------------
3 ATGACAATTGA---------------------------------------
4 ATGACAATTGA---------------------------------------
5 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAATATGACAGT
6 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAATATGAC
7 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTATGAC
8 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTATGACTGCAG
9 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTACGACAGGATCT
10 TCAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTACGAC
11 TCAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTACGAC
我想统计后面的序列,每列元素出现的次数,序列一般都不一样长,空缺的地方不要管
输出的结果象是
1: 4A,7T
2: 2T,5G,2C
3: 4G,5A
....
57: 1T (冒号前面的是列号,因为第9个序列最长,有57个元素,所以最后一列为57)
直到算到列数最多的一个
解答:
#include
<
iostream
>
#include
<
fstream
>
#include
<
map
>
#include
<
string
>
using
namespace
std;

//
表示“列”的类
class
column

...
{
public:
column();
column(const column& col);
column& operator=(const column& col);
void parse(char c); // 处理一个字符
friend ostream& operator<<(ostream& os, const column& col);
int num;
private:
map<char, int> content;
}
;

//
表示“统计结果”的类
class
result

...
{
typedef map<int, column> column_map;
typedef column_map::iterator column_map_iter;
public:
void parse(const string& row); // 处理一行数据
friend ostream& operator<<(ostream& os, const result& ret);
private:
column_map columns;
}
;

string
&
parse(
string
&
row);

int
main(
void
)

...
{
ifstream ifs("lp.txt");
result ret;
while (ifs)

...{
string row;
if (getline(ifs, row))

...{
ret.parse(parse(row));
}
}
ofstream ofs("output.txt");
ofs << ret;
return 0;
}

column::column()

...
{
num = 0;
}

column::column(
const
column
&
col)
: num(col.num),
content(col.content)

...
{
}

column
&
column::
operator
=
(
const
column
&
col)

...
{
if (this != &col)

...{
num = col.num;
content = col.content;
}
return *this;
}

void
column::parse(
char
c)

...
{
++content[c];
}

ostream
&
operator
<<
(ostream
&
os,
const
column
&
col)

...
{
os << col.num << ": ";
for (map<char, int>::const_iterator iter = col.content.begin(); iter != col.content.end(); ++iter)

...{
os << iter->second << iter->first << ",";
}
return os;
}

void
result::parse(
const
string
&
row)

...
{
int sz = row.size();
for (int i = 1; i <= sz; ++i)

...{
if (isalpha(row[i-1])) // 如果是A~Z或a~z

...{
columns[i].num = i; // 设置列号
columns[i].parse(row[i-1]); // 让列对象来统计这个字符
}
}
columns.size();
}

ostream
&
operator
<<
(ostream
&
os,
const
result
&
ret)

...
{
for (result::column_map::const_iterator iter = ret.columns.begin(); iter != ret.columns.end(); ++iter)

...{
os << iter->second << endl;
}
return os;
}

string
&
parse(
string
&
row)

...
{
string::size_type sz = row.find(' ');
row.erase(0, sz+1);
return row;
}