快手笔试第一题

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

相关推荐

炫哥_:哥们项目描述里面vector和mysql之类的都要写吗,直接开头技术栈巴拉巴拉就行了,完全不是技术点啊
点赞 评论 收藏
分享
家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
评论
点赞
10
分享

创作者周榜

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