分享一下今日头条的在线笔试编程题第一题的一些思路
笔试的岗位是服务端开发,采用的语言是c++。说下自己的编程题ac情况,第一道ac90%,第二道没时间调试啦。这种情况,实在不好意思分享 自己的思路,都没ac过。但是自己真的想了好久,还是想和大家分享一下,相互学习嘛。 第一题编程的提示点,我觉得有以下几点: 1.难度要求,提示难度是要有序的,最大差值不能大于10,其实这个很多都能想到排序。 2.难度的范围是1到100 这道题,我觉得有几个特殊情况是不好处理的,比如(以3题为例子): 1.20 70 90 2.17 70 90 3.50 50 50 分享我的思路 1.排序 刚开始我使用的是c++算法中sort排序,懒得自己写什么快排啦,主要怕出错,还得浪费时间调试,重点可不是排序。 但是如果出现的难道都是一样的,一般排序效果就不太好了。但是我不确定题目会不会出现这样的情况,也可能自己意淫的,哈哈。 注意到难度是处于1到100之间,其实可以采用桶排序,只要101个桶就行,空间复杂度是O(1),时间复杂度为O(n) 2.确定两个数之间大于10时要插入数的个数 主要处理两种情况,如:1.20与70之间,其实是要4个 2.17与70之间,却要5个 3.注意是三道题是一份卷,总的数量必须是3的倍数 说了这么多,贴代码(有点乱,主要当时时间紧): #include <iostream> #include <vector> #include <algorithm> using namespace std; int getTi(vector<int> v, int n,int m) { int count = 0; int len = n; for (int i = 0; i < len-1; i++) { //比较两个数的间隔 int tmp = v[i + 1] - v[i]; //大于10,表示要插入数进行填充,来满足小于等于10 /* 这里分两种情况,比如20、70、90 70-20等于50,但是要插4个 70-17等于53,要插5个 所以分了两种情况,是10的整倍数和不是 */ if (tmp>10) { if (tmp % 10) { count += tmp / 10; } else { count += tmp / 10; count -= 1; } } } /* 因为三道题为一组,所以必须总数为3的倍数 */ if ((count + m) % 3) { count += 3-(count + m) % 3; } return count; } int getTi2(vector<int> v, int n) { //排序,采用桶排序 /* 为什么采用桶排序,是因为,如果遇到30,30,30...这种情况的话,一般的排序避免不了 桶排序是以空间换时间,你会发现难度是不超过100的,所以用101个桶就可以把所有的情况包括,空间复杂度为O(1), 时间复杂度为O(N) */ vector<int> d; for (int i = 0; i <101; i++) { d.push_back(0); } for (int i = 0; i < n; i++) { if (!d[v[i]]) { d[v[i]] = 1; } } int k = 0; for (int i = 0; i < 101; i++) { if (d[i]) { v[k++] = i; } } //排序完交给getTi函数,真正的核心 return getTi(v, k, n); } int main() { int n; vector<int> v; //处理输入 while (cin >> n) { v.clear(); int num; for (int i = 0; i < n; i++) { cin >> num; v.push_back(num); } //真正处理程序 int count = getTi2(v, n); cout << count << endl; } //暂定等待输出,这个忽略,这个在vs中使用,gcc不需要 system("pause"); return 0; }
#字节跳动#