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 = 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 == *(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
原文地址:https://www.cnblogs.com/573177885qq/p/5850055.html