今日头条&58转转笔试
昨天参加今日头条和58转转的笔试,因为时间上有冲突,所以主要选择参加头条的笔试。
先说头条:
头条的题型:
一道改错题
三道编程题
一道设计题
感受:
做题目的的时候还是有点紧张的,因为突然遇到题目需要思考很长时间,而且不确定是否正确时,真的是着急。
做完头条笔试感觉真是好大差距,有大神三道编程全部AC,而我三道编程只能50%,0,0;
改错题一上来有点懵,半个多小时,最后还不知道改的对不对。
设计题基本是用一个套路来回答的,也不确定,但肯定不完善。
被虐的体无完肤。
下面主要记一下编程题:
第一题有思路,但是不知道哪里出的问题,最后只有50%通过。后来了解到,可能是输入输出使用cin/cout所致,在数据量比较大的时候使用scanf和printf效率会比较高。
但是第一题花费了过长的时间,大概接近50分钟。真的需要多写代码,熟练基本容器的使用。不然在写的时候,就会发现自己的代码上真的还是存在很大问题的。容器,迭代器。
第二题,因为只剩下十几分钟,刚开始题目都没有理解透。最后才读明白,可以用线段树。
第三题,直接没有时间去看。
下面贴一下大神的思路:
作者:Ck0123 链接:https://www.nowcoder.com/discuss/33986 来源:牛客网
总结:对于容器的使用要很重视,经常遇到同一类型需要用到pair容器的题目;
要提高编码的速度和质量,对于第一个题目,因为粗心可能浪费了有二十分钟调试。思路没有问题,都花在改代码上。。。
面对这样的编程笔试题目,一般,我觉得一道题目花费时间不应该超过25分钟。所以,当你在一道有思路的题目上花费超过半小时,那就说明你编码功底不够。
另外,面对题目吐过没有思路,说明对与常见算法与题目熟练度不够,需要多加练习。
实现代码,陆续补上!
1. 先上第一道改错题,感受一下:

改错如下:
作者:苏uu
链接:https://www.nowcoder.com/discuss/34136
来源:牛客网 dfsFind()函数
1. 没有处理node为空的边界条件;(我没考虑到)
2. 函数内的循环中node类型为Node*调用sons应为node->sons.size()和node->sons[i]; (考虑到了)
3. 函数递归调用是dep+1(考虑到了) 修改如下:
void dfsFind(Node* node, int dep, int counter[]) {
if(node == nullptr) return;
counter[dep]++;
for(int i = 0; i < node->sons.size(); i++){
dfsFind(node->sons[i], dep + 1, counter);
}
} find函数中:
1. 树的深度最大为100000,则保存树各个深度的数组大小应为100001,且数组没有初始化,改为depCounter[100001] = {0}; (考虑到了)
2. 函数内用来记录最大节点的数目和的变量没有初始化,且记录最多节点所在的层数的变量明与maxDep同名,修改变量名为maxNodeLevel; (同名也考虑了,但是没有修改)
修改如下:
int find(Node* root, int maxDep)
{
int depCounter[100001] = {0};
dfsFind(root, 0, depCounter);
int max = 0;
int maxNodeLevel = 1;
for(int i = 1; i < maxDep; i++) {
if(depCounter[i] > max){
max = depCounter[i];
maxNodeLevel = i;
}
}
return maxNodeLevel;
}
2. 编程第一题:

我的实现代码(AC 50%)如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <string> using namespace std; int find(vector<int> vec, int m){
int res;
for (int i = ; i < vec.size(); i++){
if (m == vec[i]){
return i;
}
}
} int main(){
int N;
cin >> N;
int x, y;
//vector<pair<int, int>> vec;
vector<int> X;
vector<int> Y; for (int i = ; i < N; i++){
cin >> x >> y;
X.push_back(x);
Y.push_back(y);
}
vector<int> X2(X);
vector<int> Y2(Y);
vector<int> res_x;
vector<int> res_y; sort(Y2.begin(), Y2.end());
for (int j = ; j < Y.size(); j++){
if (Y2[Y.size()-] == Y[j]){
res_x.push_back(X[j]);
res_y.push_back(Y[j]);
break;
}
} int temp = ;
for (int i = Y2.size()-; i>=; i--){
int res=find(Y, Y2[i]);
if (X[res]>res_x[temp]){
res_x.push_back(X[res]);
res_y.push_back(Y[res]);
temp++;
}
} int len = res_x.size();
//cout << len << endl;
for (int i = ; i < len; i++){
cout << res_x[i] << " " << res_y[i] << endl;
} system("pause");
return ;
}
思路好像正确,话说是因为cin/cout速度慢应该替换成scanf/printf.
等一个100%的代码;
我的改进版本:
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm> using namespace std; bool cmp(const pair<int, int> p1, const pair<int, int> p2){
return p1.second > p2.second;
//这样是从大到小排序了;
} int main(){ int n;
//cin >> n;
scanf("%d", &n); vector<pair<int, int>> vec;
int x, y; for (int i = ; i < n; i++){
//cin >> x >> y;
scanf("%d %d", &x, &y);
vec.push_back(make_pair(x, y));
} sort(vec.begin(), vec.end(), cmp); vector<pair<int, int>> res;
res.push_back(make_pair(vec[].first, vec[].second)); //cout << res[0].first << " " << res[0].second << endl; int temp = ;
for (int i = ; i<n; i++){
if (vec[i].first > res[temp].first){
res.push_back(make_pair(vec[i].first, vec[i].second));
temp++;
}
} int len = res.size(); for (int i = ; i < len; i++){
//cout << res[i].first << " " << res[i].second << endl;
printf("%d %d\n", res[i].first, res[i].second);
} system("pause"); return ; }
2. 编程第二题:

题目是求解区间最大值,第一个应该想到的高效方法就应该是线段树。
后来知道 这是个原题,POJ2796 使用单调栈,O(N)时间即能解决。
1)单调栈的思路:
Solution : 枚举+单调栈。看别人的解题报告学习了。单调栈这么厉害。对于这种题目,我们不能枚举区间(肯定超时),所以只能枚举最小值这个点,看看以这个点为最小值的区间向左和向右能伸展多远。这才是正确的思路。那么有了这个思路,如何实现呢。我们考虑单调栈!从第一个元素到最后一个元素一个一个入栈,我们发现,如果当前元素大于栈顶元素,那么这个元素是不能向前伸展的;同时如果当前元素小于栈顶元素,这个时候就要把栈中的元素一个一个弹出来,对于弹出来的元素,它扩展到当前元素就不能向后伸展下去了,因此对于弹出来的元素这个时候就可以计算左右端点形成区间与最小值的乘积了,维护一个最大值就好了,而对于当前元素的向前伸展端点就是新维护的栈顶元素的后一个元素了。这个题目有两个要注意的地方,第一,要手动在序列的最后加上一个-1。这样是为了能使得所有的元素都能入栈出栈。第二,对于序列中相等的元素,直接忽略就好了,其实这也是把相等的元素看成一个元素,最后计算的时候用的前缀和减前缀和,因此是可以计算到这些相等的元素的(并没有真正忽略!)。
#include <stdio.h>
#include <string.h> const int MAXN=100000+5; typedef long long LL; int n;
LL a[MAXN];
LL stack[MAXN],top;
LL left[MAXN],sum[MAXN]; int main()
{
//freopen("in","r",stdin);
while(~scanf("%d",&n)){
top=sum[0]=0;
LL ans=-1,ansL=0,ansR=0;
for(LL i=1;i<=n;i++)
scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
a[++n]=-1;
for(LL i=1;i<=n;i++){
if(!top||a[i]>a[stack[top-1]]){
stack[top++]=i;
left[i]=i;
continue;
} if(a[i]==a[stack[top-1]])
continue; while(top>0&&a[i]<a[stack[top-1]]){
top--;
LL tmp=a[stack[top]]*(sum[i-1]-sum[left[stack[top]]-1]);
if(tmp>ans)
ans=tmp,ansL=left[stack[top]],ansR=i-1;
}
LL tmpL=stack[top];
stack[top++]=i;
left[i]=left[tmpL];
}
printf("%lld\n%lld %lld\n",ans,ansL,ansR);
}
return 0;
}
2)另一种,基于线段树的思路:
题解:思路来源于【http://acm.hdu.edu.cn/showproblem.php?pid=1506】这个题。
思想是:一a[i]为某个区间的最小值,初始区间为[i,i],左端向左延伸,右端向右延伸。最后维护最大值。
但是向前向后延伸的时候不能暴力,时间不允许,这里要用到DP的思想:
定义L[MAXN]=R[MAXN]=i;对于a[i]的L[i],刚开始的L[i]=i;如果a[i]>a[L[i]-1] -> L[i]=L[L[i]-1];2、R同理。
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 100050;
LL a[MAXN], sum[MAXN];
LL L[MAXN], R[MAXN];
int n;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
sum[i] = sum[i - 1] + a[i];
L[i] = R[i] = i;
}
a[0] = a[n + 1] = -1;//保证不会访问或者访问无效。
for (int i = 1; i <= n; i++)
{
while (a[i] <= a[L[i] - 1])
L[i] = L[L[i] - 1];
}
for (int i = n; i >= 1; i--)
{
while (a[i] <= a[R[i] + 1])
R[i] = R[R[i] + 1];
}
LL ans = -1, l, r;
for (int i = 1; i <= n; i++)
{
LL T = a[i] * (sum[R[i]] - sum[L[i] - 1]);
if (ans < T)
ans = T, l = L[i], r = R[i];
}
printf("%lld\n%lld %lld\n", ans, l, r);
system("pause");
return 0;
}
下面再说58转转。
今日头条&58转转笔试的更多相关文章
- 剑指Offer——完美+今日头条笔试题+知识点总结
剑指Offer--完美+今日头条笔试题+知识点总结 情景回顾 时间:2016.9.28 16:00-18:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:完美世界笔试 ...
- 爬虫(猫眼电影+校花网+github+今日头条+拉钩)
Requests+正则表达式爬取猫眼TOP100榜电影信息 MARK:将信息写入文件解决乱码方法,开启进程池秒爬. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- python-selenium登陆今日头条
https://blog.csdn.net/a942242856/article/details/88379727 原文地址:http://www.bianbingdang.com/article_d ...
- DL4J之CNN对今日头条文本分类
一.数据集介绍 数据来源:今日头条客户端 数据格式如下: 6551700932705387022_!_101_!_news_culture_!_京城最值得你来场文化之旅的博物馆_!_保利集团,马未都, ...
- 分析 ajax 请求并抓取 “今日头条的街拍图”
今日头条抓取页面: 分析街拍页面的 ajax 请求: 通过在 XHR 中查看内容,获取 url 链接,params 参数信息,将两者进行拼接后取得完整 url 地址.data 中的 article_u ...
- 仿今日头条最强顶部导航指示器,支持6种模式-b
项目中经常会用到类似今日头条中顶部的导航指示器,我也经常用一个类似的库PagerSlidingTabStrip,但是有时并不能小伙伴们的所有需求,所以我在这个类的基础上就所有能用到的情况做了一个简单的 ...
- 服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台
服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台 服务器端开发(Python/C++)
- (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇
从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...
- Android 高仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)附源码DEMO
距离上次发布(android高仿系列)今日头条 --新闻阅读器 (二) 相关的内容已经半个月了,最近利用空闲时间,把今日头条客户端完善了下.完善的功能一个一个全部实现后,就放整个源码.开发的进度就是按 ...
随机推荐
- 集训day15 t1 poj3728
[问题描述] 有一颗n个节点的树 每个节点上都有许多奸商在卖东西,第i个奸商的理想价格为vi,即他会以vi的价格购买或卖出一件东西 有m个人希望从树上的某个点走到另一个点,问你在只进行一次买卖(每次仅 ...
- luogu P2024 食物链
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- 【2-SAT】Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) D. Innokenty and a Football League
先反复地扫(不超过n次),把所有可以确定唯一取法的给确定下来. 然后对于剩下的不能确定的,跑2-SAT.输出可行解时,对于a和¬a,如果a所在的强连通分量序号在¬a之前,则取a,否则不取a.如果a和¬ ...
- java web定时任务---quartz
写在前面: 前面有简单的记录下Timer定时的用法,但是在此次项目中,选择的是quartz来完成定时操作任务的.两者都可以完成定时操作,但是spring可以整合quartz,并且配置起来也比较简便,还 ...
- EF需要注意的virtual,懒加载,还有1对n更新
1.如果实体类型有任何一个集合属性是 virtual 的,那么该属性会懒加载,在查询该对象时,看到的类型是代理对象(proxy_xxxx), 使用new来更新1对n关系时会 增加 ).FirstOrD ...
- 使用apt-cache search搜索想要的软件包
环境: Ubuntu14.10 我在编译u-boot代码的时候遇到了如下问题: LD test/dm/built-in.o CC examples/standalone/stubs.o LD exam ...
- 支付宝签名验证实现-Delphi版
支付宝签名验证实现-Delphi版 首先介结下支付宝签名验证流程: 一 支付宝密钥生成 支付宝提供秘钥生成工具https://docs.open.alipay.com/291/105971/ 用此下 ...
- SqlServer 执行计划及Sql查询优化初探
网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚至几MS的时间差的例子来证明着什么(有点可笑),让许 ...
- 贯通Spark Streaming流计算框架的运行源码
本章节内容: 一.在线动态计算分类最热门商品案例回顾 二.基于案例贯通Spark Streaming的运行源码 先看代码(源码场景:用户.用户的商品.商品的点击量排名,按商品.其点击量排名前三): p ...
- javascript http库axios
还是那个开源项目中的代码看到的: 直接看axios官方的介绍吧,里面的用法介绍很全: https://github.com/mzabriskie/axios Installing Using npm: ...