zoukankan      html  css  js  c++  java
  • 牛客网--华为机试题相关知识(未完)

    一、 cin、getline()、cin.getline()区别

    C++输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取。

    1. cin

    结束条件:[enter],[space],[tab]

    处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,并舍弃[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]会全部舍弃。

    2. getline()

    用于string类的。使用需包含头文件#include<string>。getline(cin,string s),接收一个字符串,可以接收空格、回车等

    与cin.getline()的区别:1.cin.getline()接收输入字符串的是数组,getline()是string类型

                                        2.cin.getline()可以接收空格,但不能接收回车;getline()可以接收空格和回车

                                        3.cin.getline()会在数组结尾是'',getline()不会

    3. cin.getline()

    实际是cin.getline(接收字符串到m,接收个数n,结束字符)。接收一个字符串,可以接收空格等,最后一个字符为‘’。结束符可以通过设置第三个参数自己设置,默认是回车。m不能为string类型。

    注意:实际接收到的要比n少一个,因为最后一个字符为''。

    二、 字符串类型String

    string类型的字符串是不以‘’结尾的,因此若str有三个字符,传统C语言的字符串的str[3]是字符‘’,但是string类型的只能到str[2],str[3]是没有定义的。

    要使用strlen()、strcpy()函数需要包含C语言的字符串操作函数头文件。

    #include <string.h>
    using namespace std;
    //上述两行代码等价于下面一行代码
    #include <cstring>

    #include <string>

    using namespace std;

    string str;

    1. str.length()

    返回字符串的长度. 这个数字应该和size()返回的数字相同。

    2. str.size()

    函数返回字符串中现在拥有的字符数。

    3. str.append()

    str.append(num, ch):末尾添加num个字符ch;

    str.append(str1, index, len):末尾添加str1的字符串,下标从inddex开始,长度len;

    4.  str.substr()

    str.substr(index, num):返回本字符串的一个子串,从index开始,长num个字符。如果没有指定num,函数将简单的返回从index开始的剩余的字符串。妙用:剪切字符串

    5. str.begin() str.end()

    迭代器

    6. str.rbegin() str.rend()

    逆迭代器

    7. str.find()

    size_t position = str.find(const basic_string &s, size_type length );  //从下标index开始,寻找长度为length,返回字符串s在str中第一次出现的位置。未找到返回string::npos。

    size_t position = str.find( char ch, size_type index );  //从下标index开始,返回字符ch在str中第一次出现的位置。未找到返回string::npos。

    8. str.find_first_of()

    同find()。

    三、 vector set map queue

    1. vector

    基础知识:

    vector是表示可变大小数组的序列容器。

    就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

    本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

    注意:

    想对vector直接赋值就得定义大小,如果不定义大小,直接赋值会出错,只能用push_back

    常用操作:

    #include <vector>

    typedef struct test{

      ...

    };

    test tt;

    vector<test> sec;

    sec.push_back(tt);

    vector< ElemetType> vec;

    vector< ElemetType> tmp;  //非空

    ElemetType b[N]={....};

    访问:

    • vec.back():末尾元素
    • vec.front():第一个元素

    容量:

    • vec.size();

    修改:

    • vec.push_back():末尾添加
    • vec.pop_back():末尾删除
    • vec.assign(b,b+N)
    • vec=tmp

    迭代器:

    • vec.begin():开始
    • vec.end():结束

    算法:

    遍历:
    vector<int>::iterator it; for(it=vec.begin(); it!=vec.end(); it++) cout<<vec[it]<<endl; //或者 for (size_t i = 0; i < vec.size(); i++) { cout << vec.at(i) << endl; }
    sec.(...);
    翻转:
    #include <algorithm> reverse(vec.begin(), vec.end());
    元素排序
    #include <algorithm> sort(vec.begin(), vec.end()); //采用的是从小到大的排序 //如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法: bool Comp(const int& a, const int& b) { return a > b; } sort(vec.begin(), vec.end(), Comp);

    2. set

    set作为一个容器是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序,set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。

    #include <set>

    ElementType a[N]={...};

    set<ElementType> iset(a, a+N);

    ElementType X;

    iset.insert(X);

    迭代:

     for(set<ElementType>::iterator it=iset.begin();it!=iset.end();it++)
         cout<<*it<<endl;

    3. map

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

    #include <map>

    map对象是模板类,需要关键字和存储对象两个模板参数:

    std:map<int,string> personnel;

    插入:

    数组形式:

    例如mapStudent[1] = "student_one";  可覆盖原先数据。

    大小:mapStudent.size();

    遍历:

    map<int, string>::iterator iter;  
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
        cout<<iter->first<<' '<<iter->second<<endl; 

     4. queue

    添加头文件:

    #include <queue>

    常用的成员函数:

    queue<ElementType> q;
    q.push(...);
    q.pop();    //没有返回值
    q.size();
    q.empty;    //空返回true
    ElementType t=q.front();    //返回第一个元素,没有出队
    ElementType t=q.back();    //返回最后一个元素

    四、 cout利用控制符dec、hex、oct分别输出十进制、十六进制、八进制

    默认进制为十进制,在修改进制之前,原来格式一直有效。

    cout<<hex<<a;

    cout<<oct<<a;

    相关知识点:

    用输出流输出的都是字符串;

    五、字符串与其他类型转换

    其他类型转字符串:

    c++11标准增加了全局函数std::to_string:

    string to_string (int val);

    string to_string (long val);

    string to_string (long long val);

    string to_string (unsigned val);

    string to_string (unsigned long val);

    string to_string (unsigned long long val);

    string to_string (float val);

    string to_string (double val);

    string to_string (long double val);

    例如:

    int n;

    string str=to_string(n);

    字符串转其他类型:

    采用标准库中atoi函数,对于其他类型也都有相应的标准库函数,比如浮点型atof(),long型atol()等等

    例如:

    std::string str = "123";
    int n = atoi(str.c_str());
    cout<<n; //123

    atoi函数原型:

    int atoi(const char *nptr);

    如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。否则,返回零,

    const char *c_str();

    c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.(其实它指向的是string对象内部真正的char缓冲区),所以返回const,以防止用户的修改。

    六、stringstream类

    要想在程序中使用 stringstream 类,我们需要在源程序文件中包含头文件include<sstream>。

    例程:

    #include <sstream>
    float dollar = 1.00;
    stringstream ss;
    ss << "dozen: " << dozen << endl;

    1. 类型转换

    string -> double/int

    #include <iostream>
    #include <sstream>
    using namespace std;
    
    int main()  
    
    {  
    
        double  dVal;    
        int     iVal;
        string  str;
        stringstream ss;
    // string -> double str = "123.456789"; ss << str; ss >> dVal; cout << "dVal: " << dVal << endl; // string -> int str = "654321"; ss.clear(); ss << str; ss >> iVal; cout << "iVal: " << iVal << endl; return 0; }

    输出: dVal: 123.457

    iVal: 654231

    2 格式化输入

    string inputString("123abc 123.4one two three four");
        stringstream ss(inputString);
        string s;
        int i;
        double d;
        ss >> i >> s >> d;
        cout << i << " " << s.c_str() << " " << d ;
        while (ss >> s)
            cout <<" "<<s.c_str();
        cout << endl;

    华为题目:英文单词逆序排放 I am a boy -> boy a am I

    string s;
    getline(cin,s);
    stringstream ss(s);        //赋值
    string res="", tmp;
    while (ss>>tmp) {        //空格
         if (res=="")
             res=tmp;
         else
             es=tmp+" "+res;
        }
    cout<<res;

     七、algorithm库一些常用的方法

    1. sort 排序

    语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。

    结构体排序:降序

    struct text{
        string str;
        int a;
    };
    bool cmp(link x,link y)
    {
        return x.a>y.a;
    }
    vector<text> vec;    //变量类型是结构体
    ......
    sort(vec.begin(),vec.end(),cmp);

    2. count

    例子:查找字符串中空格数目

    string str;
    cin>>str;
    int blank_number=count(str.begin(), str.end(), ' ');

     八、 isalpha、isalnum、islower、isupper用法

    1.isalpha

    isalpha()用来判断一个字符是否为字母,如果是字符则返回非零,否则返回零。

    cout << isalpha('a');//返回非零
    cout << isalpha('2');//返回0

    2.isalnum

    isalnum()用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~z||A~Z||0~9。

    cout << isalnum('a');//输出非零
    cout << isalnum('2');//非零
    cout << isalnum('.');//

    3.islower

    islower()用来判断一个字符是否为小写字母,也就是是否属于a~z。

    cout << islower('a');//非零
    cout << islower('2');//输出0
    cout << islower('A');//输出0

    4.isupper

    isupper()和islower相反,用来判断一个字符是否为大写字母。

    cout << isupper('a');//返回0
    cout << isupper('2');//返回0
    cout << isupper('A');//返回非零
  • 相关阅读:
    Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
    Docker配置LNMP环境
    Docker安装mysqli扩展和gd扩展
    Docker常用命令
    Ubuntu常用命令
    单例模式的优缺点和使用场景
    ABP 多租户数据共享
    ABP Core 后台Angular+Ng-Zorro 图片上传
    ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
    AbpCore 执行迁移文件生成数据库报错 Could not find root folder of the web project!
  • 原文地址:https://www.cnblogs.com/learning-zjx/p/10567905.html
Copyright © 2011-2022 走看看