快手笔试工程A卷,前三道AC,第四题看不懂

第一题,求前面比他高的距离
    public static int[] DistanceToHigher (int[] height) {
        // write code here
        int n = height.length;
        int[] dp = new int[n];
        for(int i=1;i<n;i++){
            if(height[i]<height[i-1]){
                dp[i] = 1;
            }else{
                int j = i-1;
                while (j>0 && height[j] <= height[i]){
                    if(dp[j] == 0){
                        dp[i] = 0;
                        break;
                    }
                    j -= dp[j];
                }
                dp[i] = height[j] > height[i] ? i-j : 0 ;
            }
        }
        return dp;
    }

第二题,如果当前数左边有唯一一个比它大的数,输出当前数的下标,我用一个优先队列存最大值和第二大值,如果当前数大于等于第二大值,并且小于最大值,保存当前数下标,并更新优先队列
    private static String findHelper(int[] nums) {
        if(nums == null || nums.length < 2){
            return "-1";
        }
        if(nums.length == 2){
            return nums[1] < nums[0] ? "1" :"-1";
        }
        //用优先队列放最大的两个值
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        queue.add(nums[0]);
        queue.add(nums[1]);
        List<Integer> res = new ArrayList<>();
        if(nums[0] > nums[1]){
            res.add(1);
        }
        for(int i=2;i<nums.length;i++){
            if(nums[i] >= queue.peek()){
                queue.poll();
                if(nums[i] < queue.peek()){
                    res.add(i);
                }
                queue.add(nums[i]);
            }
        }
        String ans = res.size() == 0 ? "-1" : "";
        for(int i=0;i<res.size();i++){
            if(i == res.size()-1){
                ans += res.get(i);
            }else {
                ans += res.get(i) + " ";
            }
        }
        return ans;
    }

第三题:靓号,这个比较暴力,写了一百多行……不建议看,大致思路是自定义个比较器,遍历当前号码判断是不是一个靓号,是的话就扔到集合里排序
     static class Node{
        int index;
        int value;
        //为顺子还是豹子 豹子为1 顺子0
        int shunOrBao;
        String phone;
        public Node(int index,int value,int  shunOrBao,String phone){
            this.index = index;
            this.value = value;
            this.shunOrBao = shunOrBao;
            this.phone = phone;
        }
    }

    static class  MyComparator implements Comparator<Node>{
        @Override
        public int compare(Node o1, Node o2) {
            //先按价值大小
            if(o1.value != o2.value){
                return o2.value - o1.value;
            }
            //再按豹子顺子
            if(o1.shunOrBao != o2.shunOrBao){
                return o2.shunOrBao - o1.shunOrBao;
            }
            //最后是下标
            return o1.index - o2.index;
        }
    }

    private static String findHelper(String[] phones) {

        PriorityQueue<Node> queue = new PriorityQueue<>(new MyComparator());
        for(int j=0;j<phones.length;j++){
            char[] cs = phones[j].toCharArray();
            boolean isShun = false;
            boolean isBao = false;
            boolean isUp = false;
            boolean isLess = false;
            int count = 1;
            int curMax = 1;
            Node curPhone = null;
            for(int i=4;i<cs.length;i++){
                if(cs[i] == cs[i-1]){
                    //豹子
                    isBao = true;
                    if(isShun){
                        isShun = false;
                        count = 1;
                    }
                    count++;
                }else if(cs[i] == cs[i-1]+1){
                    //上升的顺子
                    isShun = true;
                    if(isBao || isLess){
                        isBao = false;
                        isLess = false;
                        count = 1;
                    }
                    isUp = true;
                    count++;
                }else if(cs[i] == cs[i-1]-1){
                    //下降的顺子
                    isShun = true;
                    if(isBao || isUp){
                        isBao = false;
                        isUp = false;
                        count = 1;
                    }
                    isLess= true;
                    count++;
                }else{
                    isBao = false;
                    isShun = false;
                    isUp = false;
                    isLess = false;
                    count = 1;
                }
                if(count >= curMax && count >= 3){
                    if(curPhone == null){
                        curPhone = new Node(j,count,isBao ? 1 : 0,phones[j]);
                    }else if(count == curMax){
                        if(curPhone.shunOrBao == 0 && isBao){
                            curPhone.shunOrBao = 1;
                        }
                    }else if(count > curMax){
                        curPhone.shunOrBao = isBao ? 1 : 0;
                        curPhone.value = count;
                    }
                    curMax = count;
                }
            }
            if(curPhone != null){
                queue.add(curPhone);
            }
        }
        if(queue.isEmpty()){
            return "null";
        }
        StringBuilder res = new StringBuilder();
        while (!queue.isEmpty()){
            Node node = queue.poll();
            if(queue.isEmpty()){
                res.append(node.phone);
            }else {
                res.append(node.phone).append(",");
            }
        }
        return res.toString();
    }





#快手##笔试题目#
全部评论
第二道不知道为啥80,一直说我数组越界,我检查了30分钟没看出来哪越界了呜呜呜
2 回复 分享
发布于 2020-03-22 21:40
😂同第三题写了100多行,但是一直80%
1 回复 分享
发布于 2020-03-22 21:38
我第二题72.几%
1 回复 分享
发布于 2020-03-22 21:47

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
09-27 10:54
重庆大学 C++
人已微死:致敬传奇耐测王。
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
1 7 评论
分享
牛客网
牛客企业服务