24号京东笔试编程题经验分享


首先我是个菜鸡
其次第二题有没有AC的,我想求个解答,我过了18%,但是想不明白。。
顺带分享一下我的第一题思路。。

第一题
创建三个数组:
    int[] height 保存每个人身高
    int[] leftMax 下标为i的学生左边(包括他自己)最高的学生
    int[] rightMin 下标为i的学生右边(包括他自己)最低的学生
如果一个下标i,左边最高的(包括他自己) <= 右边最低的(不包括他自己),那么就可以以他左边为界限分开
代码:
import java.util.Scanner;

/**
 * @author 桀骜(Geolo)
 * @version 1.0
 * @date 2019/8/24
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int count = scanner.nextInt();
            // 特殊情况
            if (count == 0) {
                System.out.println(0);
                continue;
            }
            if (count == 1) {
                System.out.println(1);
                continue;
            }
            // 获取身高
            int[] height = new int[count];
            for (int i = 0; i < count; i++) {
                height[i] = scanner.nextInt();
            }

            int[] leftMax = new int[count];
            int[] rightMin = new int[count];
            leftMax[0] = height[0];
            rightMin[count - 1] = height[count - 1];
            for (int i = 1; i < count; i++) {
                leftMax[i] = Math.max(leftMax[i - 1], height[i]);
            }
            for (int i = count - 2; i >= 0; i--) {
                rightMin[i] = Math.min(rightMin[i + 1], height[i]);
            }
            int res = 1;
            for (int i = 0; i < count - 1; i++) {
                if (leftMax[i] <= rightMin[i + 1]) {
                    res++;
                }
            }
            System.out.println(res);
        }
    }
}

第二题主要是效率问题,我用了HashMap多存了一遍学生便于快速通过学生编号找到学生,每个学生对象的friends字段是HashSet,便于快速查找和删除
最后也没说超时,死活都是18%通过率,有没有大佬给解答下的,或者发现我代码的问题
import java.util.*;

/**
 * @author 桀骜(Geolo)
 * @version 1.0
 * @date 2019/8/24
 */
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int studentCount = scanner.nextInt() * 2;
            int relationCount = scanner.nextInt();
            List<Student> students = new ArrayList<>(studentCount);
            HashMap<Integer, Student> numberMap = new HashMap<>(studentCount, 0.5f);
            for (int i = 0; i < studentCount; i++) {
                Student student = new Student(i + 1, relationCount);
                students.add(student);
                numberMap.put(i + 1, student);
            }
            for (int i = 0; i < relationCount; i++) {
                int a = scanner.nextInt();
                int b = scanner.nextInt();
                numberMap.get(a).getFriends().add(b);
                numberMap.get(b).getFriends().add(a);
            }
            Comparator<Student> comparator = new Comparator<Student>() {
                @Override
                public int compare(Student o1, Student o2) {
                    int subCount = o2.getFriends().size() - o1.getFriends().size();
                    if (subCount != 0) {
                        return subCount;
                    } else {
                        return o1.number - o2.number;
                    }
                }
            };
            List<Student> outStudents = new ArrayList<>(studentCount);
            while (relationCount != 0) {
                students.sort(comparator);
                Student student = students.get(0);
                if (student.getFriends().size() == 0) {
                    break;
                }
                Iterator<Integer> iterator = student.getFriends().iterator();
                while (iterator.hasNext()) {
                    int friendNumber = iterator.next();
                    Student friend = numberMap.get(friendNumber);
                    friend.getFriends().remove(student.number);
                    students.remove(student);
                    numberMap.remove(student.number);
                }
                relationCount -= student.friends.size();
                outStudents.add(student);
            }
            System.out.println(outStudents.size());
            for (int i = 0; i < outStudents.size(); i++) {
                System.out.print(outStudents.get(i).number + " ");
            }
        }
    }

    public static class Student {
        private int number;
        private Set<Integer> friends;

        public Student(int number, int initialCapacity) {
            this.number = number;
            friends = new HashSet<>(initialCapacity);
        }

        public Set<Integer> getFriends() {
            return friends;
        }
    }
}

菜鸡一个,轻喷

#京东##笔试题目##Java工程师#
全部评论
第一题之前有思路,打死没想到用两个数组来记录最大和最小!!!
点赞 回复 分享
发布于 2019-08-25 10:09
楼主能够说一下您的思路吗?为什么这样做可以呢?我还是没有理解呢
点赞 回复 分享
发布于 2019-08-25 09:06
更正一下,第一题是以他右边为界限划分
点赞 回复 分享
发布于 2019-08-24 21:23
import java.util.Scanner; public class jd {     public static boolean isMax(int[] arr,int pos){         for (int i = 0; i <pos; i++) {             if(arr[i]>arr[pos]){                 return false;             }         }         return true;     }     public static int group(int[] arr,int position){         if(position == 0)return 1;         if(isMax(arr,position)){             return group(arr,position-1)+1;         }else {             return group(arr,position-1);         }     }     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int stuNum = sc.nextInt();         int[] height = new int[stuNum];         for (int i = 0; i <stuNum; i++) {             height[i] = sc.nextInt();         }         System.out.println(group(height,stuNum-1));     } } 大佬能否帮我看看我的代码问题在哪啊,一直只有27%,怎么调都出不来,是调用递归时间超标的原因吗?
点赞 回复 分享
发布于 2019-08-24 21:23
tql
点赞 回复 分享
发布于 2019-08-24 21:22

相关推荐

我就是0offer糕手:北大不乱杀
点赞 评论 收藏
分享
用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
评论
2
7
分享

创作者周榜

更多
牛客网
牛客企业服务