leetcode 常用API的介绍和输入练习

常用API的介绍

容器

1. vector 容器

    • vector ans 空初始化
    • vector ans = a ; 拷贝
    • vector ans{1,2,3.0,4,5,6,7}; 赋值初始化。
    • vector ans(7,3); 赋值7个3
    • vector myvector(leastNums.begin(), leastNums.end()); ,这里leastNums是set,但是可以通过迭代器初始化, 只要里面的类型是一样的,都是int类型就可以。
    • vector<vector> (n,vector<m,1)) 二维数组的初始化
    • pop_back 是返回之前探进去的元素。

2. string

    • std::to_string(1 + 2 + 4 + 7 + 14) + " thsh is a perfect number"; 常量转换成string
    • 字符串有append 和+ . +适合char, append用于string
    • string 也可以使用pop——back和push——back,这之前不太清楚。不知道-怎么操作, 这次知道了。

3. stack (有限制的容器是没有遍历方式的。 只能push或者pop,top . )

  • s.top() //返回栈顶元素int
  • s.push() // 在栈顶压入一个元素
  • s.pop() // 弹出栈顶元素, 不返回栈顶元素。
  • s.size() //返回栈中元素的个数
  • s.empty() //判断栈是否为空栈

4. priority_queue优先队列(和栈基本操作相同 , 这种限制的数据结构,都不能乱用erase。不像红黑树这些)

:

top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头部元素

5. queue(deque 是双端队列, 我们这里只用到了队列,双端队列的api还不一样, 有四种)

入队,如例:q.push(x); 将x接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。

6. multiset的使用,不能通过key去找value,本身就是key又是value.按照自身大小排序

    • multiset<int, greater > leastNums; 从大到小的排序
    • leastNums.erase(*heapIt); leastNums.insert(*it); 插入删除操作。 注意这个是没有用auto.

7. multimap 通过key去排序,不能插入单个元素, 只能成对的pair插入。

    • 直接插入, map<string, string> direct; direct.insert( pair<string, string>(“insert”, “插入” ));
    • 下标插入 if(need.count(temp)){ window[temp]++;}
    • 如何将map的值插入push到vector呢? 输入迭代器it->second, 而不是*it.迭代器是指针,得用->
    • 判断是否存在need.count(temp)
    • for(unordered_map<int, int>::iterator a =window.begin();a!=window.end();a++){} 这个是用指针操作, for each 是用数操作。
    • 插入键值对 ans.insert(pair<int , int>{sum ,i});
    • 如何查找键值并访问呢? auto ch = ans.find(sum-k); (*ch).second);

8 unordered_map

unordered_map<int,int>
这个直接插入, 可以迭代器遍历,支持下标访问。

删除:
unordered_map 的成员函数 erase() 来移除元素。参数可以是标识元素的一个键或是指向它的一个迭代器。当参数是键时,erase() 会返回一个整数,它是移除元素的个数,所以 0 表示没有找到匹配的元素。当参数是迭代器时,返回的迭代器指向被移除元素后的元素。
auto n = people.erase (“Jim”);// Returns 0 if key not found
auto iter = people.find (“May”) ; // Returns end iterator if key not found
if(iter != people.end())
iter = people.erase (iter) ;// Returns iterator for element after “May”

9 算法

  1. 反转 std::reverse(myvector.begin(),myvector.end());
  2. 排序 sort。 sort(a.begin(), a.end(),greater()); 从大到小。
  3. for auto ch : some 实际上ch是*(it). 不能看成普通的int, char. 这是个模板。 注意这里ch是迭代器,,不能用于交换(因为这样会导致迭代器失效), 我用了swap就报错了。但是sort传入的begin和end是可以的。

10 迭代器

  1. 迭代器的初始化: auto ch = ans.begin(), 或者vector::iterator it = ans .begin().

  2. 迭代器由于是只读模式,因此中途不能对迭代器进行赋值。

  3. 迭代器如何调用对象中的多个成员? * (it). first 或者*(it). second 。

  4. 注意迭代器如果没有使用*是不能和一般的int进行比较的。

  5. 上面所说的迭代器是for(i++)情况下的, 在for each情况下只要不换内容,就可以看成基本类型。

  6. 般迭代器都是指针, 除非我们加* 才能用. 去访问。

  7. 迭代器使用技巧之如何获取最大元素并且分开:auto it = std::max_element(nums.begin(),nums.end());

    ​ vector left (nums.begin(),it);

    ​ vector right (++it,nums.end());

输入练习

背景

现在还不会输入输出, 借此机会在牛客网上练习一下。here

内容

1.接收多个a+b, 这里没数据就自己退出while循环了。 

#include<iostream>
using namespace std;

int main(){
    int a = 0 , b = 0;
    while(cin>>a>>b){
        cout<<a+b<<endl;
    }


    return 0;
    
}


2 ` n个a+b

输入描述:
输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 10^9)
输出描述:
输出a+b的结果

#include<iostream>
using namespace std;

int main(){
    int n;
    int a,b;
    cin>>n;
    for(int i = 0 ;i < n; i++){
        cin>>a>>b;
        cout<<a+b<<endl;
    }


}


3` 
链接:https://ac.nowcoder.com/acm/contest/5657/C
来源:牛客网

输入描述:
输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入
输出描述:
输出a+b的结果

#include<iostream>
using namespace std;
int main(){
    int a, b ;
    while(cin>>a>>b){
        if(a==0&&b==0)break;
        else cout<<a+b<<endl;
        
    }


}


4` 
链接:https://ac.nowcoder.com/acm/contest/5657/D
来源:牛客网

输入描述:
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
4 1 2 3 4
5 1 2 3 4 5
0
输出
复制
10
15


#include<iostream>
using namespace std;
int main(){
    int a, sum,n ;
    while(cin>>n){
        if(n==0)break;
        else {
            for(int i = 0 ; i < n ; i++ ){
                cin>>a;
                sum +=a;
            }
            cout<<sum<<endl;
            sum = 0 ;
        }
    
    }

}


5`

链接:https://ac.nowcoder.com/acm/contest/5657/E
来源:牛客网

输入描述:
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
2
4 1 2 3 4
5 1 2 3 4 5
输出
复制
10
15
C++(clang++11) 
ACM模式
   

1
#include<iostream>
2
using namespace std;
34
int main(){
5
    int a , b , n;
6
    cin>>n;
7
    for(int i = 0; i < n; i++){
8
        cin>>a;
9
        int sum = 0;
10
        for(int j = 0; j < a;j++){
11
            cin>>b;
12
            sum +=b;
13
        }
14
        cout<<sum<<endl;
15
    }
16
    return 0;
17
}


6` 
链接:https://ac.nowcoder.com/acm/contest/5657/F
来源:牛客网

输入描述:
输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
4 1 2 3 4
5 1 2 3 4 5
输出
复制
10
15


#include<iostream>

using namespace std;

int main(){
    int n,a,sum;
    while(cin>>n){
        int sum;
        for(int i = 0 ; i < n;i++){
            cin>>a;
            sum += a;
        }
        cout<<sum<<endl;
        sum = 0;
    }
}






7 链接:https://ac.nowcoder.com/acm/contest/5657/G
来源:牛客网

输入描述:
输入数据有多组, 每行表示一组输入数据。

每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:
每组数据输出求和的结果
示例1
输入
复制
1 2 3
4 5
0 0 0 0 0
输出
复制
6
9
0

#include<iostream>

using namespace std;

int main(){
    int n,a,sum;
    while(cin>>n){
        sum = sum +n;
        if(cin.get()=='\n'){  // 读一个字符,包括空格
            cout<<sum<<endl;
            sum = 0;
        }
    }
}        



链接:https://ac.nowcoder.com/acm/contest/5657/K
来源:牛客网

输入描述:
输入有多组测试用例,每组空格隔开两个整数
输出描述:
对于每组数据输出一行两个整数的和
示例1
输入
复制
1 1
输出
复制
2


#include<iostream>
using namespace std;
int main(){
    long a,b;
    while(cin>>a>>b){
        cout<<a+b<<endl;

     exit(0);   
    }
}



//  字符串处理  , 会这一个就很了灵活了, 啥都能干。 
# include <bits\stdc++.h>
using namespace std;
int main(){

    int n ;
    cin>>n;
    string str;
    fflush(stdin);//用这个可以全部清空
    while(gets(cin,str,' ')){// 这是以空格为结束, 可以设置以默认换行结束。 cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。
        if(str == " ")break;
        cout<<str<<endl;
        // if(cin.get()=='\n')break; // 读取一个字符、                
    }
    cout<<"hello"<<endl;

}

总结

  1. 自己对 输入的理解更深入了一些, 如果我们是vector这种,多种测试样例的话就设置成while,然后放入数据到vector之中,如果检测到\n就进行计算,然后把vector清空继续做。笔试前一定要看这些输入的代码。尤其是那些可以输入不知道多少行的
  2. 普通的cin对空格或者回车 tab都认为进入下一个。 如果没有的话,直接退出了。
  3. cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。会读到接收的数组或者字符串中。

reference

  1. 输入参照文章1
  2. fflush(stdin);//用这个可以全部清空
  3. https://blog.csdn.net/qq_25245961/article/details/77414134 这个也可以看看, 很好的输入参照文章。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值