华为机试在线训练-牛客网(c++)

文|Seraph

  1. 字符串最后一个单词的长度
#include 
#include 
using namespace std;

int main()
{
    string strIN;
    int iLen=0;
    while(cin>>strIN)
    {
        iLen=strIN.size();
    }
    cout<<iLen<<endl;
}
  1. 计算字符个数
#include 
#include 
#include 
using namespace std;


int main()
{
    int result=0;
    string strIN;
    char chIN;
    
    getline(cin, strIN);
    chIN = cin.get();
    if(isupper(chIN))
        chIN=tolower(chIN);
    for(auto ch : strIN)
    {
        if(isupper(ch))
        {
            ch=tolower(ch);
        }
        if(ch==chIN)
            result++;
    }
    cout<<result<<endl;
    return 0;
}
  1. 明明的随机数
#include 
#include 
using namespace std;

int main()
{
    int iNum;
    int iNumber;
    
    while(cin>>iNum)//牛客网的测试题,输入一定要记得用这种形式,否则可能通不过。假设可以重复输入使用。
    {
        set<int> result;
        for(int i=0; i<iNum; i++)
        {
            cin>>iNumber;
            result.insert(iNumber);
        }
        set<int>::iterator itr;
        for(itr=result.begin(); itr!=result.end(); itr++)
        {
            cout<<*itr<<endl;
        }
    }
   
    return 0;
}
  1. 字符串分隔
#include 
#include 
using namespace std;
const int BASE = 8;

int main()
{
    string strIN;
    while(getline(cin, strIN))
    {
        if(strIN.size()>0)
        {
            for(int i=0; i<strIN.size(); i++)
            {
               if(i%BASE==0 && i!=0)
                   cout<<endl;
                cout<<strIN[i];
            }
            
            int lastNum = strIN.size()%BASE;
            if(lastNum>0)
            {
                for(int i=0; i<BASE - lastNum; i++)
                {
                    cout<<'0';
                }
            }
            
            cout<<endl;
        }
    }
    return 0;
}
  1. 进制转换
    我一开始觉得这个题目有点难,因为题目说的是输入输出都是字符串,可能需要考虑大数问题。
    可如果考虑大数问题,实属有点难。后面发现不用考虑也能AC…
#include 
using namespace std;
int main()
{
    int a;
    while(cin>>hex>>a)
    {
        cout<<a<<endl;
    }
    return 0;
}

上面这个解法挺逗的,但题目可能考察的是个十百千的转换。

  1. 质数因子
#include 
using namespace std;

int main()
{
    long lNum;
    while(cin>>lNum)
    {
        long lTemp= lNum;
        for(long i=2; i<=lNum; i++)
        {
            while(lTemp%i==0)
            {
                lTemp /= i;
                cout<<i<<" ";
            }
        }
    }
    return 0;
}
  1. 取近似值
#include 
using namespace std;
int main()
{
	float a;
	cin>>a;
	cout<<int(a+0.5);
	return 0;
}
  1. 合并表记录
#include 
#include 

using namespace std;

int main()
{
    int iNum;
    while(cin>>iNum)
    {
        map<int, int> mapRes;
        int iKey,iValue;
        for(int i=0; i<iNum; i++)
        {
            cin>>iKey>>iValue;
            mapRes[iKey] += iValue;
        }
        for(auto itr=mapRes.begin(); itr!=mapRes.end(); itr++)
        {
            cout<<itr->first<<" "<<itr->second<<endl;
        }
    }
    return 0;
}
  1. 提取不重复的整数
#include 
#include 
#include 
using namespace std;

int main()
{
    string strIN;
    while(cin>>strIN)
    {
        set<char> setI;
        for(auto rItr=strIN.rbegin(); rItr!=strIN.rend(); rItr++ )
        {
            if(setI.find(*rItr)==setI.end())
            {
                cout<<*rItr;
                setI.insert(*rItr);
            }
        }
        cout<<endl;
    }
    return 0;
}
  1. 字符串统计个数
#include 
#include 
#include 

using namespace std;

int main()
{
    string strIN;
    while(cin>>strIN)
    {
        set<char> setCh;
        int iRes=0;
        for(auto itr=strIN.begin(); itr!=strIN.end(); itr++)
        {
            if(setCh.find(*itr)==setCh.end())
            {
                setCh.insert(*itr);
                iRes++;
            }
        }
        cout<<iRes<<endl;
    }
    return 0;
}

突然发现这里使用find是多余的,因为set不会插入相同的字符,最后输出set的大小就行。

#include 
#include 
#include 

using namespace std;

int main()
{
    string strIN;
    while(cin>>strIN)
    {
        set<char> setCh;
        int iRes=0;
        for(auto itr=strIN.begin(); itr!=strIN.end(); itr++)
        {
             setCh.insert(*itr);
        }
        cout<<setCh.size()<<endl;
    }
    return 0;
}
  1. 数字颠倒
#include 
#include 
using namespace std;

int main()
{
    int iNum;
    while(cin>>iNum)
    {
        while(iNum/10)
        {
            cout<<iNum%10;
            iNum /= 10;
        }
        cout<<iNum<<endl;
    }
    return 0;
}

上面的解法是通过除余的方法,对整数的每位数字进行输出处理。
也可以,先将整数转为string类型,再做反转处理。现代C++鼓励使用STL、泛型编程。

#include 
#include 
#include 
using namespace std;

int main()
{
    int iNum;
    while(cin>>iNum)
    {
        string strNum;
        strNum = to_string(iNum);
        reverse(strNum.begin(), strNum.end());
        cout<<strNum<<endl;
    }
    return 0;
}
  1. 字符串反转
#include 
#include 
using namespace std;

int main()
{
    string strIN;
    while(cin>>strIN)
    {
        reverse(strIN.begin(), strIN.end());
        cout<<strIN<<endl;
    }
    return 0;
}
  1. 句子逆序
    我的思路是先把整句逆序处理,再单词逆序处理。
#include 
#include 
#include 
using namespace std;

string reverse(string sentence)
{
    reverse(sentence.begin(), sentence.end());
    auto itrPre = sentence.begin();
    for(auto itr=sentence.begin(); itr!=sentence.end(); itr++)
    {
        if(*itr==' ' && itrPre!=itr)
        {
            reverse(itrPre, itr);
            itrPre=itr+1;
        }
    }
    reverse(itrPre, sentence.end());
    
    return sentence;
}

int main()
{
    string strIN;
    while(getline(cin,strIN))
    {
        strIN = reverse(strIN);
        cout<<strIN<<endl;
    }
    return 0;
}

后面发现,好像是自己想多了,其实直接将单词反转拼接就OK了。。。

#include 
#include 
#include 
using namespace std;

string reverse(string sentence)
{
    stringstream ss(sentence);
    string str;
    string temp;
    while(ss>>str)
    {
        temp = str + ' ' + temp;
    }
    return temp;
}

int main()
{
    string strIN;
    while(getline(cin,strIN))
    {
        strIN = reverse(strIN);
        cout<<strIN<<endl;
    }
    return 0;
}
  1. 字符串的连接最长路径查找
    用Set的自带排序,但考虑到可能有相同的单词,所有使用multiset。
#include 
#include 
using namespace std;

int main()
{
    int iNum;
    while(cin>>iNum)
    {
        multiset<string> mulSetStr;
        string strIN;
        for(int i=0; i<iNum; i++)
        {
            cin>>strIN;
            mulSetStr.insert(strIN);
        }
        for(auto s : mulSetStr)
        {
            cout<<s<<endl;
        }
    }
    return 0;
}
  1. 求int型正整数在内存中存储时1的个数
    这个题,剑指offer中位的运算有提过,iNum &= iNum-1的含义是,消除最后一位1。
#include 
using namespace std;

int main()
{
    int iNum;
    while(cin>>iNum)
    {
        int iCount=0;
        while(iNum)
        {
            iNum &= iNum-1;
            iCount++;
        }
        cout<<iCount<<endl;
    }
    return 0;
}
  1. 购物单

你可能感兴趣的:(刷题)