快手笔试第一题

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class KSP1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine().trim();
        if ("None".equals(line) || "".equals(line)) {
            System.out.println("True");
            return;
        }


        String[] numbersStringArray = line.split(",");
        int[] numbers = new int[numbersStringArray.length];
        for (int i = 0; i < numbersStringArray.length; i++) {
            numbers[i] = Integer.parseInt(numbersStringArray[i]);
        }

        Tree root = new Tree();
        int height = (int) (Math.log(numbers.length + 1) / Math.log(2)) - 1;
        buildFullTree(root, height);

        int index = 0;
        LinkedList<Tree> stack = new LinkedList<>();
        stack.addLast(root);

        for (int i = 0; i <= height; i++) {
            int length = stack.size();

            for (int j = 0; j < length; j++) {
                Tree tmp = stack.pop();
                tmp.value = numbers[index++];
                if (tmp.left != null) {
                    stack.add(tmp.left);
                }

                if (tmp.left != null) {
                    stack.add(tmp.right);
                }
            }
        }

        if (isSearchTree(root)) {
            System.out.println("True");
        } else {
            System.out.println("False");
        }


    }

    public static void buildFullTree(Tree root, int n) {
        LinkedList<Tree> stack = new LinkedList<>();
        stack.addLast(root);
        int count = 0;

        do {
            int length = stack.size();
            for (int i = 0; i < length; i++) {
                Tree tmp = stack.pop();
                tmp.left = new Tree();
                tmp.right = new Tree();
                stack.addLast(tmp.left);
                stack.addLast(tmp.right);
            }
        } while (++count < n);
    }

    public static boolean isSearchTree(Tree root) {
        if (root == null) return true;
        Stack<Tree> stack = new Stack<>();
        Tree pre = null;
        while (root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if (pre != null && root.value <= pre.value) return false;
            pre = root;
            root = root.right;
        }
        return true;
    }


}


class Tree {
    int value;
    Tree left;
    Tree right;

    public Tree(int value) {
        this.value = value;
    }

    public Tree() {
    }
}

#快手##笔试题目#
全部评论
原来也想的是建树然后中序输出看是否有序,事后问了acm小伙伴他说直接遍历看2n+1和2n+2是不是都比他小就行了😂😂😂
点赞 回复 分享
发布于 2019-03-30 23:53
建树太麻烦了,还不如写个函数获取下子节点下标,b不过看了三楼老哥感觉自己太傻了
点赞 回复 分享
发布于 2019-03-31 00:27
为啥还去建一棵树,直接和堆排序那样判断就好了
点赞 回复 分享
发布于 2019-03-30 22:48
建树和赋值应该可以放在一起的,时间比较紧没又太深入思考所以就分开了
点赞 回复 分享
发布于 2019-03-30 22:21

相关推荐

09-16 16:47
门头沟学院 C++
点赞 评论 收藏
分享
搜索部&nbsp;首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
10
分享

创作者周榜

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