美团 java二面试程序设计题 面试题笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

笔记记录一下二面面试题和回顾求解思路,求解过程


一、两个有序集合合并成一个有序集合(不允许转集合)

主要思路:
1.定义两个下标指针,分别指向两个数组
2.定义一个merge数组存储merge后的数组
3.两个数组开始遍历 每次遍历会比较 数组对应下标的值 小的优先放入merge数组 然后下标+1 依次进行
注意:
因为连个数组长度不等,所以会出现一个数组遍历完了 另一个数组还没遍历完,所以需要对这种情况进行判断
代码示例:

public class MergeArray {
    public static void main(String[] args) {
        int[] array = new int[3];
        int[] array2 = new int[2];
        array[0] = 1;
        array[1] = 10;
        array[2] = 100;

        array2[0] = 2;
        array2[1] = 20;

        int [] merge = new int[array.length + array2.length];
        int position = 0;
        int position2 = 0;

        for (int i = 0; i < array.length + array2.length; i++) {
            if (position == array.length && position2 < array2.length){
                merge[i] = array2[position2];
                position2++;
                continue;
            }
            if (position2 == array2.length && position < array.length){
                merge[i] = array[position];
                position++;
                continue;
            }
            if (array[position] < array2[position2]){
                merge[i] = array[position];
                position++;
            }else {
                merge[i] = array2[position2];
                position2++;
            }
        }

        for (int i1 = 0; i1 < merge.length; i1++) {
            System.out.println(merge[i1]);
        }
    }
}

二、一个数组求出其中出现次数最多的元素个数

代码思路:

  • 利用Map<String,Integer>存储元素及其个数,遍历数组若存在则通过key获取value 并加一 不存在则存入map ,value 置为一
  • 遍历Map打印
    代码示例:
public class Main {
    public static void main(String[] args) {
        String[]strings = new String[] {"a","b","C","D","a","b","b"};
        Map<String,Integer> map = new HashMap<>();

		//存入map并进行值的计算
        for (int i1 = 0; i1 < strings.length; i1++) {
            if (map.containsKey(strings[i1])){
                map.put(strings[i1],map.get(strings[i1])+1);
            }else {
                map.put(strings[i1],1);
            }
        }
        int temp = 0;
		//遍历map
        for (Integer value : map.values()) {
            if (temp<value){
                temp = value;
            }
        }
        System.out.println(temp);
    }
}

三、 新建一个时间类 SelectTime,有两个熟悉 startTime endTime;有一个SelectTime类集合,里面是{18:00-18:59 19:00-19:59…}这一类时间段数据,写一个函数判断输入集合输入的多个时间段是否合法并且时间段时间不重复

代码思路:

  • 根据升序排序集合
  • 判断时间是否合法 —开始时间 < 结束时间
  • 判断时间段是否重复
    注意:
    • compareTo的值结果 a > b 结果大于0
    • 判断时间段是否重复 只需要循环size-1次

代码示例:

public class SelectTime {
    public SelectTime() {
    }

    public SelectTime(String startTime, String endTime) {
        this.startTime = startTime;
        this.endTime = endTime;
    }

    public String startTime;
    public String endTime;

    @Override
    public String toString() {
        return "SelectTime{" +
                "startTime='" + startTime + '\'' +
                ", endTime='" + endTime + '\'' +
                '}';
    }
}


public class Main {
    public static void main(String[] args) {
        List<SelectTime> list = new ArrayList<>();
        list.add(new SelectTime("18:00","18:59"));
        list.add(new SelectTime("19:00","19:59"));
        list.add(new SelectTime("19:00","19:59"));
        list.add(new SelectTime("16:00","16:59"));
        list.add(new SelectTime("15:59","15:00"));

        //按照开始时间升序排序
        list.sort(new Comparator<SelectTime>() {
            @Override
            public int compare(SelectTime o1, SelectTime o2) {
                return o1.startTime.compareTo(o2.startTime);
            }
        });
        //判断时间合法  开始时间小于结束时间
        for (int i1 = 0; i1 < list.size(); i1++) {
            SelectTime selectTime = list.get(i1);
            int i11 = selectTime.startTime.compareTo(selectTime.endTime);
            if (i11 > 0){
                System.out.println("不合法");
            }
        }
        //判断时间段是否重复
        for (int i = 0; i < list.size()-1; i++) {
            int next = i;
            SelectTime selectTime = list.get(0);
            SelectTime selectTimeNext = list.get(next + 1);
            if (selectTime.endTime.compareTo(selectTimeNext.startTime) > 0){
                System.out.println("时间有交叉");
            }
            if (selectTime.startTime.compareTo(selectTimeNext.endTime) < 0){
                System.out.println("时间有交叉");
            }
        }
    }
}

总结

道阻且长,好好学习,天天向上。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值