2017腾讯实习笔试题
Posted 牧马人夏峥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
思路:
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; }
以上是关于2017腾讯实习笔试题的主要内容,如果未能解决你的问题,请参考以下文章