1073. Scientific Notation <string>
来源:互联网 发布:贪玩蓝月转生修为数据 编辑:程序博客网 时间:2024/06/11 08:05
题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1073
string
既然用到了string,我们就回顾一下常用的string接口,每一个接口都有几种重载,只需会用常用的即可。
size()/begin()/end()就不提了。
首先给出一个网址(http://www.com/reference/string/string/),自己经常参考一些C++信息。
1. find()
size_t find (const string& str, size_t pos = 0) const noexcept;size_t find (const char* s, size_t pos = 0) const;size_t find (const char* s, size_t pos, size_type n) const;size_t find (char c, size_t pos = 0) const noexcept;find返回下标。
各参数:
str: 查找str第一次出现的位置。
s: 查找C语言字符串s第一次出现的位置。
c: 查找字符c第一次出现的位置。
pos: 从pos处开始查找,包括pos。
n: 需要匹配的位数。
因此,我们常用的是:
size_t find (const string& str, size_t pos = 0) const noexcept;size_t find (const char* s, size_t pos = 0) const;size_t find (char c, size_t pos = 0) const noexcept;
2. erase()
接口声明见:http://www.cplusplus.com/reference/string/string/erase/。
string& erase (size_t pos = 0, size_t len = npos);
iterator erase (const_iterator p);
iterator erase (const_iterator first, const_iterator last);
(1) 按下标删除:区间为[pos, pos+npos); npos为需要删除的数量,pos为开始位置。
(2) 按迭代器删除一个字符:给出迭代器p。
(3) 按迭代器删除一个区间:给出2个迭代器first和last。
其实,如果删除一个字符k,直接使用
str.erase('k');
3. insert()
重载比较多
string& insert (size_t pos, const string& str);
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
string& insert (size_t pos, const char* s);
string& insert (size_t pos, const char* s, size_t n);
string& insert (size_t pos, size_t n, char c);iterator insert (const_iterator p, size_t n, char c);
iterator insert (const_iterator p, char c);
template <class InputIterator>iterator insert (iterator p, InputIterator first, InputIterator last);
string& insert (const_iterator p, initializer_list<char> il);常用的有:
(1) 在pos处开始插入str。
(3) 在pos处开始插入C语言字符串s。
(4) 在pos处开始插入C语言字符串s的前n位。
(5) 在pos处开始插入n个字符c。两种形式,如果使用0作为下标,他不知道你这个是下标还是迭代器的!
如果在开始插入字符,不应使用:s1.insert(0, n, '0'); 在结尾处插入使用s1.insert(s1.end(), n, '0'); 其他位置的插入,可以使用下标。 比如:s1.insert(1, n, '0');
4. replace()
string& replace (size_t pos, size_t len, const string& str);string& replace (const_iterator i1, const_iterator i2, const string& str);
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
string& replace (size_t pos, size_t len, const char* s);string& replace (const_iterator i1, const_iterator i2, const char* s);
string& replace (size_t pos, size_t len, const char* s, size_t n);string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n);
string& replace (size_t pos, size_t len, size_t n, char c);string& replace (const_iterator i1, const_iterator i2, size_t n, char c);
template <class InputIterator> string& replace (const_iterator i1, const_iterator i2, InputIterator first, InputIterator last);
string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il);这个的参数分布还是比较有规律的:3个参数(4个的那个目前没用过),前两个为范围,可以是下标或者迭代器,最后有一个是字符串,或者字符。
5. substr()
string substr (size_t pos = 0, size_t len = npos) const;看起来很简单,确实挺简单:开始位置pos,长度npos。
6.总结
如果用下标,参数pos为开始位置,如果是一个范围npos是长度。如果是迭代器,老老实实范围两端的迭代器。
本题代码
// 这道题目用C的话,做起来比较繁琐。用stl会省事很多// 使用了find()/erase()/insert()/size()/begin()/end()#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <set>#include <map>#include <algorithm>using namespace std;int main(){#ifdef ONLINE_JUDGE#elsefreopen("E:\\in.txt", "r", stdin);#endifchar buf[10000+10];gets(buf);string line = buf;//cout << "line:" << line << endl;if(line[0] == '-'){cout << '-';}string s1 = line.substr(1, line.find('E', 1)-1);//cout << "s1:" << s1 << endl;string s2 = line.substr(line.find('E', 1)+1, line.size());//cout << "s2:" << s2 << endl;int index = atoi(s2.c_str());//cout << "index:" << index << endl;s1.erase(s1.find('.'), 1);//cout << "s1:" << s1 << endl;if(index <0){index = -index;s1.insert(s1.begin(), index, '0');// 在开始处插入index个'0'/*--------------------------------------------------------- 如果在开始插入字符,不应使用:s1.insert(0, index, '0'); 在结尾处插入使用s1.insert(s1.end(), index, '0'); 其他位置的插入,可以使用下标。 比如:s1.insert(1, index, '0');---------------------------------------------------------*/s1.insert(1, 1, '.');//cout << "s1:" << s1 << endl;cout << s1 << endl;}else{if(s1.size()-1 > index){s1.insert(index+1, 1, '.');}else if(s1.size() == index){//nothing}else{s1.insert(s1.end(), index+1 - s1.size(), '0');}cout << s1 << endl;}return 0;}
- 1073. Scientific Notation <string>
- 1073. Scientific Notation (20) -- string,数字处理
- 1073. Scientific Notation
- 1073. Scientific Notation (20)
- PAT 1073. Scientific Notation
- 1073. Scientific Notation (20)
- 1073.Scientific Notation
- 1073. Scientific Notation (20)
- 1073. Scientific Notation (20)
- 1073. Scientific Notation (20)
- 1073. Scientific Notation (20)
- 1073. Scientific Notation (20)
- 1073. Scientific Notation (20)
- 1073. Scientific Notation
- 1073. Scientific Notation (20)
- 1073. Scientific Notation (20)
- 1073. Scientific Notation
- 1073. Scientific Notation (20)
- [C++] NRV优化
- 分享iOS开发的精品书籍
- 灵墟洞天
- 内存卡里照片丢失如何恢复
- mybatis传多参数的问题
- 1073. Scientific Notation <string>
- 生命诚可贵
- Windows 64位 安装Oracle instantclient 官方绿色版和PL/SQL Developer 总结
- Android自定义Dialog
- 5天学会jaxws-webservice编程第二天
- SQLite入门之五移动客户端上操作SQLite
- hdoj 2001 计算两点间的距离 java代码编写 math类中的方法详细介绍
- jvm优化参数整理(持续补充)
- 从配置文件中获取类名,利用反射创建对象