分享一下今日头条的在线笔试编程题第一题的一些思路
笔试的岗位是服务端开发,采用的语言是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;
}
#字节跳动#
叮咚买菜工作强度 199人发布