快手笔试第一题

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
建树和赋值应该可以放在一起的,时间比较紧没又太深入思考所以就分开了
点赞 回复 分享
发布于 2019-03-30 22:21
为啥还去建一棵树,直接和堆排序那样判断就好了
点赞 回复 分享
发布于 2019-03-30 22:48
建树太麻烦了,还不如写个函数获取下子节点下标,b不过看了三楼老哥感觉自己太傻了
点赞 回复 分享
发布于 2019-03-31 00:27

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-01 21:29
点赞 评论 收藏
分享
点赞 10 评论
分享
牛客网
牛客企业服务