ACM练习——第三天

今天继续练习C++和ACM模式

在写题之前先了解一些新的知识

1.#include <algorithm>

        `#include <algorithm>` 是 C++ 标准库中的头文件之一,其中包含了一系列用于处理各种容器(如数组、向量、列表等)和其他数据结构的算法。这个头文件提供了多种常用的算法,包括排序、查找、删除等,以及一些用于操作迭代器的函数。

        以下是一些 `algorithm` 头文件中常用的函数:

1. **排序算法:**
   - `std::sort(begin, end)`:对范围 `[begin, end)` 的元素进行排序。
   - `std::stable_sort(begin, end)`:稳定排序,保留相等元素的相对顺序。

2. **查找算法:**
   - `std::find(begin, end, value)`:在范围 `[begin, end)` 中查找值为 `value` 的元素,返回指向该元素的迭代器。
   - `std::binary_search(begin, end, value)`:在已排序的范围 `[begin, end)` 中二分查找值为 `value` 的元素。

3. **删除和修改算法:**
   - `std::remove(begin, end, value)`:从范围 `[begin, end)` 中删除所有值为 `value` 的元素,返回指向删除后范围末尾的迭代器。
   - `std::replace(begin, end, old_value, new_value)`:将范围 `[begin, end)` 中所有值为 `old_value` 的元素替换为 `new_value`。

4. **其他算法:**
   - `std::max_element(begin, end)`:在范围 `[begin, end)` 中找到最大元素的迭代器。
   - `std::min_element(begin, end)`:在范围 `[begin, end)` 中找到最小元素的迭代器。

        这些算法提供了一种方便且高效的方式来操作和处理各种数据结构。通过 `#include <algorithm>`,你可以在程序中使用这些算法,而不必自己实现它们。


2.第一题

输入两行,第一行是n,第二行是n个字符,每个字符之间使用空格隔开,然后输出的是一个已经排好序的字符串。ok开干

代码如下:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    int n;
    // 获取n的值
    cin >> n;
    // 创建一个字符串数组记录所有的字符串
    vector<string> result(n);
    // 存入字符串
    for(int i = 0; i < n; i++){
        cin >> result[i];
    }
    
    //因为要的是排序好的字符串,所以我们再进行排序
    sort(result.begin(), result.end());
    
    //输出字符串
    for(int i = 0; i < n; i++){
        cout << result[i];
        // 但是记住要添加空格
        if(i < n - 1){
            cout << " ";
        }
    }
    return 0;
}

呃,头文件有些是不需要使用的,但是我现在就学了这么几个,所以就有几个放几个啦嘿嘿

3.第二题

这里相对于上一题就没有给出明确的判断循环结束的条件了,但是仍然也是不影响,这种情况昨天已经遇到过了,直接拿下

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    vector<string> result;
    string one;
    // cin >> one这个写法就是,只要没有到Null就一直循环
    while(cin >> one){
        // 二话不说直接放入字符数组
        result.push_back(one);
        // 如果是换行符
        // 那么到这里这一行就结束了
        if(cin.get() == '\n'){
            // 先将数组进行排序处理
            sort(result.begin(), result.end());
            // 然后进行输出
            for(int i = 0; i < result.size(); i++){
                cout << result[i];
                if(i < result.size() - 1){
                    cout << " ";
                }
            }
            // 然后记得换行
            cout << endl;
            // 最后记得清除数组元素
            result.clear();

            // 然后跳过这次循环
            continue;
        }

        
    }
    return 0;
}

说是直接拿下,但是在这里我和  cin.get()方法周旋了好久

我一直不明白为什么我前面已经把 \n换行符加进去了,为什么还需要后面自己手动换行

那么我就做了很多测试,最后通过如下代码测试出来了。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<string> result;
    string one;
    // cin >> one这个写法就是,只要没有到Null就一直循环
    while (cin >> one) {
        // 二话不说直接放入字符数组
        cout << one << "我是one" <<endl;
        result.push_back(one);
        // 如果是换行符
        // 那么到这里这一行就结束了
        char get = cin.get();
        cout << "B" << get << "E" << endl;

        if ( get == '\n') {
            cout << "换行了";
            // 先将数组进行排序处理
            sort(result.begin(), result.end());
            // 然后进行输出
            for (int i = 0; i < result.size(); i++) {
                cout << result[i];
                if (i < result.size() - 1) {
                    cout << " ";
                }
            }
            // 然后记得换行
            cout << endl;
            // 最后记得清除数组元素
            result.clear();

            // 然后跳过这次循环
            continue;
        }


    }
    return 0;
}

然后输出的样子是这样的、

我输入了  a空格b空格c

你会发现  cin.get()每次读取的都是已经读取之后的下一个元素,这就是为什么\n没了需要自己手动的添加,get()方法会将它消耗掉,所以你可以采用peek()方法,但是由于并没用将cin.peek()这个方法的数据添加到数组里,所以还是要自己手动添加。这个问题到这里就完美的结束了。

欧耶\(^o^)/

欧耶\(^o^)/

欧耶\(^o^)/

欧耶\(^o^)/

欧耶\(^o^)/

 4.第三题

使用逗号隔开其实也差不多,但是由于C++的输入法则  “,” 是没有办法变成输入的隔开符号的,所以就只能采用读取一行,然后根据  逗号  隔开的方法来操作了

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>

using namespace std;

int main(){
    vector<string> result;
    string line;
    // 直接读取一行文字
    while(getline(cin, line)){
        // 放入字符串流
        stringstream strLine(line);
        // 用于存储每个单词
        string word;
        
        // 通过 ‘,’分割
        while(getline(strLine, word, ',')){
            result.push_back(word);
        }
        
        // 排序
        sort(result.begin(), result.end());
        
        // 输出排序之后的结果
        for(int i = 0; i < result.size(); i++){
            cout << result[i];
            if(i < result.size() - 1){
                cout << ",";
            }
        }
        // 记得换行
        cout << endl;
        // 记得清空数组
        result.clear();
    }
    
    return 0;
}

结束了

这几天的突击基础训练就这样结束了,说实话,基本上算是基础的过渡到C++了,已经貌似,好像可以摆脱使用Java写算法的痛苦了。ok

ヾ( ̄▽ ̄)Bye~Bye~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WenJGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值