今日头条后台笔试第一道编程题解法

当时没做完,后来花了一点时间把它做完,应该是ac了,但是时间复杂度可能有点高。

题目大概是这样的:假设有一点x,其右上区域没有任何点,输出符合条件的点x。

思路是这样的:

1.先按照x轴的值对坐标点进行排序,最后一个点无论如何都满足条件。

2.再依次比较y轴的值,由于x值已经排好序(由小到大),y值只要遇到后面有比它大的,该点就不符合条件,继续循环判断下一个点是否符合条件。如果某一个点,其y值大于后面所有点的y值,该点符合条件,输出(注意是大于其后的所有的点的y值,前面有点的y值大于它,它仍旧符合条件,因为前面的点的x值是小于它的)。
代码如下:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc1 = new Scanner(System.in);
        int n = sc1.nextInt();
        int[][] intArray = new int[n][2];
        String str1 = null;
        Scanner sc2 = new Scanner(System.in);
        for(int i = 0; i < n; i++) {
             str1 = sc2.nextLine();
             String[] strArray = str1.split(" ");
             intArray[i][0] = Integer.parseInt(strArray[0]);
             intArray[i][1] = Integer.parseInt(strArray[1]);
        }
        //按x值,由小到大进行排序
        for(int i = 0; i < n - 1; i++) {
            for(int j = 0; j < n - i - 1; j++) {
                if(intArray[j][0] > intArray[j+1][0]) {
                    //将x轴值进行交换
                    int temp1 = intArray[j][0];
                    intArray[j][0] = intArray[j+1][0];
                    intArray[j+1][0] = temp1;
                    //y轴值必须跟着x走,作相同交换
                    int temp2 = intArray[j][1];
                    intArray[j][1] = intArray[j+1][1];
                    intArray[j+1][1] = temp2;
                }
            }
        }
        //对y值进行比较,由于x已经从小到大排序,只要后面数组的y值有更大的,该数组不满足条件
        int x ;
        for(int i = 0; i < n; i++){
            for(x = i + 1; x < n; x++){
                if(intArray[i][1] < intArray[x][1]) {

                    break;
                }
            }
            if(x == n || i == n) {
                System.out.print(intArray[i][0]);
                System.out.print(" ");
                System.out.print(intArray[i][1]);
                System.out.println();
            }
        }

    }
}
#字节跳动##Java工程师#
全部评论
对x和y都建立一个排序的数组,遍历x排序的那个数组,用二分查找在y排序的数组中找到当前点在y排序数组中的位置,开始在y数组中比较x,y数组中后面所有点的x都小于当前点的x才满足条件。排序是nlgn,后面每次二分查找是lgn,所以总复杂度还是nlgn,正好可以过。
点赞 回复 分享
发布于 2017-08-22 23:53
思路基本一样,50%过的,到现在没有见到一个兄弟100%的,你后面两道题做的怎么样啊
点赞 回复 分享
发布于 2017-08-23 09:07
贪心算法的活动安排问题
点赞 回复 分享
发布于 2017-08-23 08:43
按照Y作为优先级扔到优先队列里,Y最大的肯定符合题意,从对列取出扔到一个vector里。然后依次从队列取出点,当且仅当横坐标大于vector中末尾一个点的横坐标时满足要求,然后将这个点扔到vector里。最后vector按照横坐标排序输出。总共nlgn复杂度,不过还是只过了50报超时……
点赞 回复 分享
发布于 2017-08-23 04:16
nlogn,感觉没问题啊,为啥只有50%呢?
点赞 回复 分享
发布于 2017-08-23 00:43
我也是这个思路 50% 对于大数来说好像不对 应该是超内存或者超时 后来改用先按x排列一次 然后从x最大的开始 首先这个点一定满足 记下maxy 其次往前遍历 只要y>=maxy就满足 之后记maxy=y 并继续向前查询 直到最后 讲之前满足条件的项都逆向输出 这样时间复杂度是nlogn+n 说了这么多 我也才通过了50% 问问各位大佬 这个思路有什么bug吗
点赞 回复 分享
发布于 2017-08-23 00:04
想一个极端的例子,如果排序后,所有点的y值是递减的,也就是所有点都是符合条件的,那这个算***在每个点都把后面的所有点都遍历一遍
点赞 回复 分享
发布于 2017-08-22 23:44
我用的这方法,0%_(:з」∠)_
点赞 回复 分享
发布于 2017-08-22 23:42
我用的这方法,50%
点赞 回复 分享
发布于 2017-08-22 23:37

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
10-13 13:42
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务