您的位置:首页 > 其它

北京邮电大学2011年网院方向复试上机题 解题报告

2012-03-05 19:40 351 查看
[b]九度OJ
题目1177:查找[/b]

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:554 解决:130

题目描述:

读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1、翻转 从下标为i的字符开始到i+len-1之间的字符串倒序;2、替换 命中如果第一位为1,用命令的第四位开始到最后的字符串替换原读入的字符串下标 i 到 i+len-1的字符串。每次执行一条命令后新的字符串代替旧的字符串(即下一条命令在作用在得到的新字符串上)。

命令格式:第一位0代表翻转,1代表替换;第二位代表待操作的字符串的起始下标int i;第三位表示需要操作的字符串长度int len。

输入:

输入有多组数据。

每组输入一个字符串(不大于100)然后输入n,再输入n条指令(指令一定有效)。

输出:

根据指令对字符串操作后输出结果。

样例输入:

bac

2

003

112as

样例输出:

cab

cas

//北邮2011网院:1177:查找
//命令格式:第一位0代表翻转,1代表替换;
//第二位代表待操作的字符串的起始下标int i;
//第三位表示需要操作的字符串长度int len。
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
int i, j, k, n, m;
int start, len;
string s, t, temp;
ifstream cin("BUPT_1177.txt");//
while( cin >> s >> n ){
for( i=0; i<n; i++ ){
cin >> t;
start = t[1]-48;
len = t[2] - 48;
//cout << start << " " << len << endl;//
if( t[0] == '0' ){	//翻转命令 别忘了单引号
temp = s.substr(start,len);
//cout << temp << endl;//
reverse(temp.begin(), temp.end());
}
else
temp = t.substr(3,t.length()-3);
s = s.erase(start,len);
s.insert(start,temp);
cout << s << endl;
}
}
system("pause");//
return 0;
}


[b]九度OJ
题目1178:复数集合[/b]

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:669 解决:103

题目描述:

一个复数(x+iy)集合,两种操作作用在该集合上:

1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE;

2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE;

最开始要读入一个int n,表示接下来的n行每一行都是一条命令。

输入:

输入有多组数据。

每组输入一个n(1<=n<=1000),然后再输入n条指令。

输出:

根据指令输出结果。

样例输入:

3

Pop

Insert 1+i2

Pop

样例输出:

empty

SIZE = 1

1+i2

SIZE = 0

提示:

模相等的输出b较小的复数。

a和b都是非负数。

没注意提示 WA了好几次orz 稍微有点复杂 不过并不算难

//北邮2011网院:1178:复数集合
//Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出  empty  ,
//不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE;
//Insert a+ib  指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE;
//n条指令 (1<=n<=1000)
//提示:模相等的输出b较小的复数。 a和b都是非负数。
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

struct COMPLEX{
int a, b;
};
COMPLEX c[1000];

int StringToNum( string s ){
int i, len, r;
len = s.length();
for( i=0; i<len; i++ ){
if( i==0 )
r = s[i]-48;
else r = r*10 + s[i]-48;
}
return r;
};

int module( COMPLEX x ){
return x.a*x.a+x.b*x.b;
};

bool cmp( COMPLEX x, COMPLEX y ){
int xm = module(x), ym = module(y);
if( xm==ym )
return x.a < y.a;
return xm < ym;
};

int main()
{
int i, j, k, n, m;
int len, size;
string t, s, temp, aS, bS;	//t=命令
ifstream cin("BUPT_1178.txt");//
while( cin >> n ){
size = 0;
for( i=0; i<n; i++ ){
cin >> t;
if( t == "Pop" ){
//cout << "i=" << i << " ";//
if( size == 0 )
cout << "empty\n";
else{
sort(c,c+size,cmp);
cout << c[size-1].a << "+i" << c[size-1].b << endl;
size--;
cout << "SIZE = " << size << endl;
}
}
else{	//Insert命令
cin >> s;
len = s.length();
for( j=0; j<len; j++ )
if( s[j]=='+' )
break;
aS = s.substr(0,j);
bS = s.substr(j+2);	//不给出长度就默认到结尾
//cout << aS << " " << bS << endl;//
c[size].a = StringToNum(aS);
c[size].b = StringToNum(bS);
size++;
cout << "SIZE = " << size << endl;
}
}// for
}
system("pause");//
return 0;
}


附上第一题需要用的库函数的说明 网上找的 很详尽

===========以下内容为转载===========
C:

char st[100];
1. 字符串长度
strlen(st);

2. 字符串比较
strcmp(st1,st2);
strncmp(st1,st2,n);   把st1,st2的前n个进行比较。

3. 附加
strcat(st1,st2);
strncat(st1,st2,n);   n表示连接上st2的前n个给st1,在最后不要加'\0'。

4. 替换
strcpy(st1,st2);
strncpy(st1,st2,n); n表示复制st2的前n个给st1,在最后要加'\0'。

5. 查找
where = strchr(st,ch)   ch为要找的字符。
where = strspn(st1,st2); 查找字符串。
where = strstr(st1,st2);

C++:

<string>
string str;
1. 字符串长度
len = str.length();
len = str.size();

2. 字符串比较
可以直接比较
也可以:
str1.compare(str2);
str1.compare(pos1,len1,str2,pos2,len2); 值为负,0 ,正。
nops 长度到完。

3. 附加
str1 += str2;
或
str1.append(str2);
str1.append(str2.pos2,len2);

4. 字符串提取
str2 = str1.substr();
str2 = str1.substr(pos1);
str2 = str1.substr(pos1,len1);
string a=s.substr(0,4);       //获得字符串s中 从第0位开始的长度为4的字符串

5. 字符串搜索
where = str1.find(str2);
where = str1.find(str2,pos1); pos1是从str1的第几位开始。
where = str1.rfind(str2); 从后往前搜。

6. 插入字符串
不是赋值语句。
str1.insert(pos1,str2);
str1.insert(pos1,str2,pos2,len2);
str1.insert(pos1,numchar,char);    numchar是插入次数,char是要插入的字符。

7. 替换字符串
str1.replace(pos1,str2);
str1.replace(pos1,str2,pos2,len2);

8. 删除字符串
str.erase(pos,len)
str.clear();

9. 交换字符串
swap(str1,str2);

10. C --> C++
char *cstr = "Hello";
string str1;
cstr = cstr;
string str2(cstr);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: