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

九度OJ 题目1177:查找
时间限制: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;
}

九度OJ 题目1178:复数集合
时间限制: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);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值