首页 > 代码库 > 2017腾讯实习笔试题

2017腾讯实习笔试题

三道编程题在60分钟内做出来并不容易,加油吧

技术分享

这题做出来容易,但在规定的时间内跑出结果并不容易,参考网友的答案:

技术分享
#include<iostream>#include<string>using namespace std; bool isCap(char c){    if (c >= A && c <= Z)        return true;    else        return false;} //用位运算交换void mSwap(char &a, char &b){    if (a != b)    {        a ^= b;        b ^= a;        a ^= b;    }}  int main(){    string s;    while (cin >> s)    {        int len = s.size();        int end = len;        for (int i = 0; i<end; ++i)        {            if (isCap(s[i]))            {                int j = i;                for (; j<len- 1; ++j)                    mSwap(s[j], s[j + 1]);                --end;//精华!                --i;            }        }        cout << s <<endl;    }    return 0;}
View Code

 

技术分享

 思路:

    1.先排序
         特殊情况:如果排完序之后发现数组中所有数都相同,直接输出结果
             结果为:差最大个数 = 差最小个数 = (n * (n-1))/2;(两两组合)
    2.统计数组中每种数字的个数(这里用的map)
    3.计算差最小个数
        3.1.如果数组中没有重复数字,说明最小差不为0,最小差肯定是数组中相邻两个数的差
            因此,遍历一边数组,计算并统计最小差。
        3.2.如果数组中有重复数字,说明最小差是0,此时,遍历一边map,数字个数不为0的
            数字会产生最小差0,利用公式计算即可
    4.计算差最大个数
        只有一种情况,最大值与最小值的两两组合,即最大值个数 * 最小值个数
写出的代码结果一直不正确,有空再看看。
技术分享
void process(vector<int>& vec, int num){    int max=0, min=0;    unordered_map<int, int>num_count;    if (num > 1)    {        sort(vec.begin(), vec.end());        //如果全部元素相同,直接输出结果        if (*vec.begin() == *(vec.end() - 1))        {             max = num*(num - 1) / 2;            min = max;        }        else        {            for (auto it = vec.begin(); it != vec.end(); it++)            {                num_count[*it]++;            }            //计算最小差个数                        for (const auto &data : num_count)            {                //如果数字个数超过1,则最小差为0,遍历并统计map中大于1的个数。                if (data.second > 1)                    min += data.second*(data.second - 1) / 2;            }            //如果数字无重复,最小差(绝对值)为排序数组相邻元素的差            if (min == 0)            {                int min_data =http://www.mamicode.com/ INT_MAX;                for (auto it = vec.begin(); it != vec.end()-1; it++)                {                    if (min_data > *(it + 1) - *it)                        min_data = *(it + 1) - *it;                }                for (auto it = vec.begin(); it != vec.end() - 1; it++)                {                    if (min_data =http://www.mamicode.com/= *(it + 1) - *it)                        min++;                }            }            //计算最大差个数,用最大值个数*最小值个数            int m1 = 1, m2 = 1;            for (auto it = vec.begin(); it != vec.end() - 1; it++)            {                if (*it != *(it + 1))                    break;                m1++;            }            for (auto it = vec.rbegin(); it != vec.rend() - 1; it++)            {                if (*it != *(it + 1))                    break;                m2++;            }            max = m1*m2;        }    }    cout << min << " " << max;}int main(){    int num;    while (cin >> num)    {        vector<int> vec(num);        int temp;        for (int i = 0; i < num; i++)        {            cin >> temp;            vec.push_back(temp);        }        process(vec, num);        cout << endl;    }    return 0;}
View Code

 

2017腾讯实习笔试题