算法刷题小技巧【持续补充~】
🕺作者: 主页
我的专栏 |
---|
C语言从0到1 |
探秘C++ |
数据结构从0到1 |
探秘Linux |
😘欢迎 ❤️关注 👍点赞 🙌收藏 ✍️留言
文章目录
- 前言
- 使用scanf格式化读取数据
- 输入字符串 getline
- cin.getline() 使用举例
- 两种getline函数
- getline使用举例
- 输入多行字符串(行数未知)
- 截断字符串
- 字符串转浮点数 stof函数
- PAT甲级真题1108 求平均值
- 输入格式
- 输出格式
- 数据范围
- 输入样例1:
- 输出样例1:
- 输入样例2:
- 输出样例2:
- 题解
- 对二维数组去重
前言
欢迎提供新技巧,可在评论区留言~
使用scanf格式化读取数据
eg:
scanf("%d.%d.%d %d.%d.%d",&a,&b,&c,&d,&e,&f); //可以读取数据格式为1.2.4 2.14.15
输入字符串 getline
使用getline函数:
cin.getline()也是常用的读取整行string的方式。
getline()操作的对象是string,cin.getline()操作的对象的char数组
cin.getline()函数读取至新行结尾或直到达到最大限制的整行文本。函数定义如下:
// (buffer, stream_size, delimiter) istream& getline(char*, int size, char='\n') // The delimiter character is considered as '\n' istream& getline(char*, int size)
- 提取字符直到定界符。
- 将字符存储在缓冲区中。
- 提取的最大字符数为size-1。
cin.getline() 使用举例
#include using namespace std; int main() { char str[20]; cin.getline(str, 20); cout string s; getline(cin, s); cout if (str.size() == 0) break; //如果读取的是空,则读取结束 v.push_back(str); } int n; cin n; int cnt = 0; // 合法数字个数 double sum = 0; // 合法数字总和 while (n -- ) { string num; cin >> num; double x; bool success = true; /* 不加try catch报错terminate called after throwing an instance of 'std::invalid_argument' what(): stof(若传入不可转化为浮点型的字符串)会抛出异常 */ try { size_t idx = sizeof(num); // size type 用来记录大小的数据类型 x = stof(num, &idx); // 字符串转换为float型 // stof判断"5.2abc"这类字符串时视"5.2"为合法,"abc"不合法,但实际上5.2abc不合法 if (idx 1000) success = false; int k = num.find('.'); if (k != -1 && num.size() - k > 3) success = false;// 不超过2个小数位(最后一位是num.size()-1) if (success) cnt ++, sum += x; else printf("ERROR: %s is not a legal number\n", num.c_str()); } if (cnt > 1) printf("The average of %d numbers is %.2lf\n", cnt, sum / cnt); else if (cnt == 1) printf("The average of 1 number is %.2lf\n", sum); else puts("The average of 0 numbers is Undefined"); return 0; }
对二维数组去重
std::vector removeDuplicates(const std::vector& arr) { std::vector sortedArr = arr; // 对二维数组排序 std::sort(sortedArr.begin(), sortedArr.end()); // 去除重复项 auto last = std::unique(sortedArr.begin(), sortedArr.end()); sortedArr.erase(last, sortedArr.end()); return sortedArr; }
在上述代码中,std::unique 函数用于去除连续的重复项,该函数位于 头文件中。函数的原型如下:
template ForwardIt unique(ForwardIt first, ForwardIt last);
其中,first 和 last 是表示要处理的元素范围的迭代器,ForwardIt 是一个泛型类型。std::unique 函数会返回一个指向最后一个不重复元素之后位置的迭代器。这意味着,从 first 到 last 的范围内的所有连续重复元素都被移到了范围的末尾,并且返回的迭代器指向了新范围的终点。
在代码中,我们使用 std::unique 函数将数组 sortedArr 中的重复项移到了末尾,并将返回的迭代器保存在 last 变量中。然后,我们使用 erase 函数将重复项从数组中删除,其原型如下:
template Iterator erase(Container& cont, Iterator pos);
其中,cont 是容器,pos 是指向要删除元素位置的迭代器。erase 函数会从容器中删除指定位置的元素,并返回一个指向被删除元素之后位置的迭代器。
在我们的代码中,sortedArr 是一个二维向量,我们使用 erase 函数将 last 到 sortedArr.end() 范围内的元素从 sortedArr 中删除,即删除了末尾的重复项。
通过上述操作,我们使用 std::unique 函数和 erase 函数成功去除了二维数组中的连续重复项。