美文网首页
OJ的IO问题(二)

OJ的IO问题(二)

作者: shelldon1024 | 来源:发表于2020-07-03 18:33 被阅读0次

    牛客网提供了一个 OJ在线编程常见输入输出练习场,里面包含了常见的数据输入输出格式要求,如果能够掌握这个练习场的习题,以后一般不会在输入输出问题上耗费大量时间了。以下对这个练习场的习题做个总结。

    A+B(1)~(5)字符串排序(1) 相对简单,输入数据的行数和每行的数据个数都是直接或间接给定的,循环即可。

    A+B(6) 是的输入数据行数是不确定的,但是每行的数据个数间接都由第一个数据给定。

    // A+B(6)
    #include <iostream>
    
    int main()
    {
        int count;
    
        // 当数据读完,输入流的状态变为 false
        while (std::cin >> count) {
            int num, sum = 0;
            while (count--) {
                std::cin >> num;
                sum += num;
            }
            std::cout << sum << std::endl;
        }
    
        return 0;
    

    A+B(7)字符串排序(2) 类似,数据行数是不确定的,每行的数据个数也是不确定的,这种情况可以选择每次读取一行,按行处理数据,使用字符串输入流的格式化输入简化数据处理。

    // A+B(7)
    #include <iostream>
    #include <sstream>
     
    int main()
    {
        int num, sum;
        std::string line;
     
        // 第一个数据用格式化输入处理,数据读完的话自然就退出了
        while (std::cin >> sum) {
            std::getline(std::cin, line);
             
            // 每次初始化一个 iss
            // 不要通过 istringstream::str 去复用同一个 iss
            std::istringstream iss(line);
             
            while (iss >> num) {
                sum += num;
            }
    
            std::cout << sum << std::endl;
        }
         
        return 0;
    }
    

    最后是 字符串排序(3),它除了数据行数不确定、每行数据个数不确定之外,每个数据之间并不是空白字符(如空格、制表、回车、换行等),而是另外自定义的特殊字符。间隔符不是空白字符导致的后果是,不能直接使用流对象的格式化输入输出操作符去格式化读取数据。这里的解决方式是每次读取一行字符串,用该字符串构建字符串输入流,用字符串输入流的非格式化输入接口定制间隔符,从而读取每一个字符串数据。

    // 字符串排序(3)
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <vector>
     
    int main()
    {
        std::string line;
        std::string str;
        
        while (std::getline(std::cin, line)) {
            std::istringstream iss(line);
            std::vector<std::string> strs;
            
            while (std::getline(iss, str, ',')) {
                strs.emplace_back(std::move(str));
            }
            
            if (strs.empty()) continue;
            
            std::sort(strs.begin(), strs.end());
            
            for (auto it = strs.begin(); it != strs.end() - 1; it++) {
                std::cout << *it << ',';
            }
            std::cout << strs.back() << std::endl;
        }
     
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:OJ的IO问题(二)

          本文链接:https://www.haomeiwen.com/subject/qpjsqktx.html