ACM模式注意事项

两个很不错的帖子

帖子1
帖子2


1、字符串输入

函数介绍

cin

cin的原理,简单来讲,是有一个缓冲区,我们键盘输入的数据,会先存到缓冲区中,用cin可以从缓冲区中读取数据。

  • 注意1:cin可以连续从键盘读入数据
  • 注意2:cin以空格、tab、换行符作为分隔符
  • 注意3:cin从第一个非空格字符开始读取,直到遇到分隔符结束读取

getline()

从cin中,也可以看出,当我们要求读取的字符串中间存在空格的时候,cin会读取不全整个字符串,这个时候,可以采用getline()函数来解决。

  • 注意1:使用getline()函数的时候,需要包含头文件
  • 注意2:getline()函数会读取一行,读取的字符串包括空格,遇到换行符结束

实例

1. 输入字符串,根据空格隔开,可输入多组字符串

string str;
while(cin >> str){
	cout << str << endl;
}

输入:

abc  def     ghi 

输出:

abc
def
ghi

2. 输入带空格的字符串

string a;
getline(cin,a)

2、二叉树的输入

力扣常规输入,转换为ACM模式

  • 例子
    在这里插入图片描述

  • 转换思路:
    二叉树 推导到 序列 是层序遍历的过程,这里其实就是将 序列 转换为 二叉树,转换方法为:借助二叉树的链式存储。如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2。
    在这里插入图片描述

  • 实现代码:

    #include <iostream>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    
    /*二叉树的定义*/
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
    };
    
    
    TreeNode *newNode(int val) {
        TreeNode *node = (TreeNode *) malloc(sizeof(TreeNode));
        node->val = val;
        node->left = node->right = NULL;
        return node;
    }
    
    
    /*根据数组构造二叉树*/
    TreeNode *construct_binary_tree(const vector<int> &vec) {
        vector<TreeNode *> vecTree(vec.size(), NULL);
        TreeNode *root = NULL;
        /*把输入数值数组,先转化为二叉树节点数组*/
        for (int i = 0; i < vec.size(); i++) {
            TreeNode *node = NULL;
            if (vec[i] != -1) node = newNode(vec[i]);
            vecTree[i] = node;
            if (i == 0) root = node;
    
        }
        /*构建二叉树各节点之间的关系*/
        for (int i = 0; i * 2 + 1 < vec.size(); i++) {
            if (vecTree[i] != NULL) {
                vecTree[i]->left = vecTree[i * 2 + 1];
                if (i * 2 + 2 < vec.size()) vecTree[i]->right = vecTree[i * 2 + 2];
            }
        }
        return root;
    }
    
    
    /*层序打印打印二叉树,验证时使用*/
    void print_binary_tree(TreeNode *root) {
        queue<TreeNode *> que;
        if (root != NULL) que.push(root);
        vector<vector<int>> result;
        while (!que.empty()) {
            int size = que.size();
            vector<int> vec;
            for (int i = 0; i < size; i++) {
                TreeNode *node = que.front();
                que.pop();
                if (node != NULL) {
                    vec.push_back(node->val);
                    que.push(node->left);
                    que.push(node->right);
                }
                    /* 这里的处理逻辑是为了把null节点打印出来,用-1 表示null*/
                else vec.push_back(-1);
            }
            result.push_back(vec);
        }
        for (int i = 0; i < result.size(); i++) {
            for (int j = 0; j < result[i].size(); j++) {
                cout << result[i][j] << " ";
            }
            cout << endl;
        }
    }
    
    
    int main() {
        /*用-1表示null*/
        vector<int> vec = {4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8};
        TreeNode *root = construct_binary_tree(vec);
        print_binary_tree(root);
        return 0;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Elec Liu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值