今日头条研发岗笔试题

AC了3个 第四个交卷发现了一个bug 但是不知道对不对 请大佬们看看

T1:DFS搜联通快

import java.util.Scanner;

public class A {

    int m,n;
    int vis[][] = new int[1005][1005];
    int mp[][] = new int[1005][1005];
    int fx[][] = {{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
    int p = 0,q = 0,sum;
    Scanner scanner;

    void solve(){
        scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String []ss = s.split(",");
        n = Integer.parseInt(ss[0]);
        m = Integer.parseInt(ss[1]);

        for(int i=0;i<n;i++){
            String str = scanner.nextLine();
            String[]num = str.split(",");
            for(int j=0;j<m;j++){
                mp[i][j] = Integer.parseInt(num[j]);
            }
        }
        // System.out.println(n+"  "+m);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]==1&&vis[i][j]==0){
                    sum = 0;
                    p++;
                    dfs(i,j);
                    q = Math.max(q,sum);
                }
            }
        }
        System.out.println(p+","+q);
    }

    void dfs(int h,int l){
        sum++;
        vis[h][l] = 1;
        for(int i=0;i<8;i++){
            int hh = fx[i][0]+h;
            int ll = fx[i][1]+l;
            if(check(hh,ll)){
                dfs(hh,ll);
            }
        }
    }

    boolean check(int hh, int ll) {
        if(hh>=0&&hh<n&&ll>=0&&ll<m&&mp[hh][ll]==1&&vis[hh][ll]==0){
            return  true;
        }
        return false;
    }

    public static void main(String[] args) {
        new A().solve();
    }
}

T2:把所有区间做个结构体排序  java写结构体排序写炸了,,浪费了好多时间
import java.util.*;
public class B {
    class Node implements Comparable<Node>{
        public long l;
        public long r;
        public Node(){
        }
        public Node(Long l, Long r) {
            this.l = l;
            this.r = r;
        } @Override public int compareTo(Node o) {
            if(o.l==this.l)return this.r<o.r?-1:1;
            return this.l<o.l?-1:1;
        }
    }
    ArrayList<Node> node = new ArrayList<>();
    ArrayList<Node> ans = new ArrayList<>();
    int n;
    int m;
    Scanner scanner = new Scanner(System.in);
    void solve() {
        m = scanner.nextInt();
        n = 0;
        while (m-- > 0) {
            String str = scanner.next();
            //System.out.println(str);
            String[] str1 = str.split(";");
            for (int i = 0; i < str1.length; i++) {
               // System.out.println(str1[i]);
                String[] s = str1[i].split(",");
                node.add(new Node(Long.parseLong(s[0]), Long.parseLong(s[1])));
                n++;
            }
        }
        Collections.sort(node);
        long l = node.get(0).l;
        long r = node.get(0).r;
        for(int i=0;i<node.size();i++){
            if(node.get(i).l>r){
                ans.add(new Node(l,r));
                l = node.get(i).l;
                r = node.get(i).r;
            }else{
                r = Math.max(r,node.get(i).r);
            }
        }
        ans.add(new Node(l,r));
        StringBuffer ss = new StringBuffer("");
        for(int i=0;i<ans.size();i++){
            ss.append(ans.get(i).l);
            ss.append(",");
            ss.append(ans.get(i).r);
            if(i!=ans.size()-1){
                ss.append(";");
            }
        }
        System.out.println(ss.toString());
    }
    public static void main(String[] args) {
        new B().solve();
    }
}


T3:  感觉像背包,,但是有很多不好处理  ,哪位大佬能提供AC代码不?


T4:  没有AC  我的做法是记录a数组每个数左右比他小的连续的数的个数  记录b数组左右比他大的数的连续的个数  然后就是当ai是最大数 bi是最小数时算下区间个数
不知道对不对  因为代码提交的时候把bi写成ai了,,结束后才发现

没有AC的代码

#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int al[100005],ar[100005];
int bl[100005],br[100005];
int n;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
    }
    al[0] = 0;
    bl[0] = 0;
    for(int i=1;i<n;i++)
    {
        if(a[i]>=a[i-1])al[i] = al[i-1]+1;
        else al[i] = 0;
        if(b[i]<=b[i-1])bl[i]= bl[i-1]+1;
        else bl[i] = 0;
    }
    ar[n-1] = 0;
    br[n-1] = 0;
    for(int i=n-2;i>=0;i--)
    {
        if(a[i]>=a[i+1])ar[i] = ar[i+1]+1;
        else ar[i] = 0;
        if(b[i]<=b[i+1])br[i] = br[i+1]+1;
        else br[i] = 0;
    }
    long long ans = 0;
    for(int i=0;i<n;i++)
    {
        if(a[i]<b[i])
        {

            int l = min(al[i],bl[i]);
            int r = min(ar[i],br[i]);
            //cout<<l<<" "<<r<<endl;
            ans+=(1ll+l+r+l*r*1ll);
        }
    }
    cout<<ans<<endl;
    return 0;
}


T5:区间结构排序下就是  特别注意第二天的情况 r+m  最后还要判断 r<=m  因为只能在第一天看完

#include<bits/stdc++.h>
using namespace std;
struct st
{
    int l,r;
}s[100005];
bool cmp(st a, st b){
    if(a.l==b.l){
        return a.r<b.r;
    }
    return a.l<b.l;
}
int n,m;
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++){
        scanf("%d%d",&s[i].l,&s[i].r);
        if(s[i].l>s[i].r)s[i].r+=m;
    }
    sort(s,s+n,cmp);
    int ans = 0;
    int l = 0,r = 0;
    for(int i=0;i<n;i++){
            if(s[i].r>m)continue;
        if(s[i].l>=r){
            ans++;
            l = s[i].l,r = s[i].r;
        }else{
            if(s[i].r<r)r = s[i].r;
        }
    }
    cout<<ans<<endl;
    return 0;
}        




#字节跳动##笔试题目##题解#
全部评论
4 24 1 5 6 10 11 23 23 22 第五题 看下这组数据  输出是4 这个人从第一天的1点  一直看到 第二天的22点  这也算【每天最多完整观看】吗。。。
点赞 回复 分享
发布于 2018-08-12 12:23
话说大佬为啥一会Java,一会c++
点赞 回复 分享
发布于 2018-08-12 12:30
看来T5比T3 T4要简单一点么?。。。
点赞 回复 分享
发布于 2018-08-12 12:30
想问下大佬第一题中的fx[][]代表什么意思?求教
点赞 回复 分享
发布于 2018-08-12 20:10
T3用dp[i]表示两者相差i时最大的团队积分,跑一遍就行了
点赞 回复 分享
发布于 2018-08-17 17:50

相关推荐

01-01 23:38
门头沟学院 Java
杭州同花顺 后端开发 1.5n左右
想当offer收割机的肖恩很爱刷美剧:现在这个环境,狠狠赚钱才是实际的,1是银行的子公司,技术很老,现在银行都在大规模降薪这种科技子公司肯定也在逐渐降薪,而且你也不好跳槽;2虽然钱比1多,但是各种福利待遇基本全无,加班时间可能跟1差不多,但是后续跳槽会比1好;3是大平台,而且钱确实给的很够,发展前景就不用看了,现在这个环境技术发展前景并不一定就好,非技术并不一定就差。个人认为3>2>1
点赞 评论 收藏
分享
断电再接线:1. 简历排版方面,你这内容比较少,一页放完。各模块之间建议用明显的分隔线分开,现在一眼看上去非常乱。教育经历留白太多。项目经历格式不统一。 2. 第一个项目,硬件设计太笼统,硬件架构规划是指板级电路设计还是FPGA逻辑设计?FPGA时序逻辑设计具体指的什么?实现的三个低速协议以及使用协议进行控制时序,是指什么? 3. 第二个项目,我觉得你可以和第一个项目整合一下,合并为一个项目。第二个项目说实话随便买个zynq开发板都有一直petalinux的教程,作为一个独立的项目不合适的,更像是一个小作业。 4. 第三个项目,项目内容这里,其实和环境搭建之类的东西提一嘴就好了,环境准备和编译安装工具链这种东西没多大必要写,实在要写的话可以 说 使用docker 独立sdk环境之类的。你说的这个工具我没用过,我用的比较多的是busybox和buildroot,是基于menuconfig进行配置的,如果scratch也是类似的模式的话,那我觉得这个项目也经不起细推。你可以往内核裁剪那方向靠,我说的这两个工具你也可以看看。 5. 你熟悉这些接口时序的话,你可以进一步去看一下驱动开发,然后面试的时候突出这个作为重点。第三个项目也可以将驱动开发给补充进去。因为单编内核和构建文件系统,其实很多时候是体力劳动。 6. 特长这里,独立成一个荣誉奖项的模块,把你获得的奖学金和竞赛奖项放一起。数模的话,写了国赛,美赛就不用写了。 7. 总的来说可以了,你简历上写的东西你只要都熟悉,找个实习还是没问题的。 8. 嵌入式分为硬件,底层软件和应用软件,看你的经历我建议你往底层靠,多去熟悉常用的通信接口,去看内核和驱动,网络编程这块也可以去了解一下。然后去**刷刷hot100
点赞 评论 收藏
分享
新记话事人:你就和她说去抖音了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务