腾讯2019实习面试题
1. 题目一:数列极差问题
小Q的好朋友牛牛在纸上写了长度为n的正整数数列。牛牛要求小Q每次从数列中选取两个数a,b,把这两个数从数列中移除出去,然后在数列中加入a * b + 1,直到只剩一个数为止。小Q发现根据操作顺序的不同,最后得到的数的大小也不一样。小Q现在想让你帮他计算,在所有情况中能获得的最大值减去能获得的最小值等于多少?
输入:
3
1
2
3
输出:
2
解题方法:
第一步:先要对你输入的一个数组进行排序
第二步:擦掉最大的两个数,然后插入a*b+1 继续擦掉最大的两个数,最终得到最大值。
第三步:擦掉最大的两个数,然后插入a*b+1继续擦掉最小的两个数,最终得到最小值。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 int main(){ 7 int n; 8 int num[1000]; 9 while(scanf("%d", &n) != EOF){ 10 for(int i=0; i<n; ++i) 11 scanf("%d", &num[i]); 12 sort(num, num+n); 13 if(n<3){ 14 printf("%d\n", 0); 15 continue; 16 } 17 int min = num[n-1]; 18 for(int i=0; i<n-1; ++i){ 19 min = min * num[n-2-i] + 1; 20 } 21 22 int max = num[0]; 23 for(int i=1; i<n; ++i){ 24 max = max * num[i] + 1; 25 } 26 printf("%d\n", max-min); 27 } 28 return 0; 29 }
2. 题目二:自增数组
小Q发现了一种特殊的数组,叫做自增数组。这个数组支持一种操作:每次操作可以把数组中一个数自增1。现在有一个长度为n的自增数组,小Q现在想利用这个操作把数组中的每个数都变得不一样,请问你最少需要多少次操作?
#include <iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n = 0; vector<int> array; cin>>n; int t; for(int i=0 ;i<n; ++i){ cin>>t; array.push_back(t); } vector<int> cf; sort(array.begin(), array.end()); for(int i=1; i<n; ++i){ if(array[i] == array[i-1]) cf.push_back(array[i]); } int len = max(n+1, array[n-1]+1); vector<int> arr(len,0); for(int i=0; i<n; ++i){ arr[array[i]] = array[i]; } int idx=0; int cnt=0; for(int i=1; i<len; ++i){ if(arr[i] == 0){ cnt += i - cf[idx]; idx++; if(idx == cf.size()) break; } } cout<<cnt; }