两道简单的Java笔试题

面试一定要复盘,说不定复试时就考了,谨记谨记!
记录一下一个CTO出的两道题

第一题

假设有很多英文单词(没有重复),保存在类型为List 的列表对象里。现在我们要把这些英文单词分组,要求是把所有相同的字母组成的单词(但字母顺序可能不同)分到同一个组。例如aabc、baca、abcc、baac、accb 五个单词分组的话,就会分成两组,一组包含aabc、baca、baac,另一组包含abcc、accb 。请问你会怎么实现?

package app.test;

import java.util.*;

public class Test1 {

    public static void main(String[] args) {

        /**
         * 定义好数组,将字符数据放入
         */
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "aabc","abbc","abcc","accb","acbb","accc","cacc");
        /**
         * 定义一个Map,用于存放数据,key为排好序的字符,value为数组,数组中包含所有相同的字符串
         * 循环数组中内容,然后进入后首先将此条数据进行排序处理
         */
        Map<String,List> map = new HashMap<>();
        for (String listStr: list) {
            String str = sortStr(listStr);
            /**
             * 判断Map中有没有这个排好序的key,如果有的话,直接获取原来的value数组,将新单词添加				进去,然后再put进去
             * 如果没有的话,则将排好序的字符作为key,单词放到一个新的list中,然后put到Map中去
             */
            if (map.containsKey(str)){
                List exist = map.get(str);
                exist.add(listStr);
                map.put(str,exist);
            }else {
                List newList = new ArrayList();
                newList.add(listStr);
                map.put(str,newList);
            }
        }
        System.out.println(map);
    }

    /**
     * 字符串排序
     * @param str 传入的字符串内容
     * @return 返回排好序的内容
     */
    public static String sortStr(String str) {
        char[] chars = str.toCharArray();
        char temp;
        for (int j = 0; j < chars.length - 1; j++) {
            for (int i = 0; i < chars.length - 1 - j; i++) {
                if (String.valueOf(chars[i]).compareTo(String.valueOf(chars[i + 1])) > 0) {
                    temp = chars[i];
                    chars[i] = chars[i + 1];
                    chars[i + 1] = temp;
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        for (char c: chars) {
            sb.append(c);
        }
        return sb.toString();
    }
}

第二题

传入两个时间段的时间戳,判断两个时间段是否存在冲突

package app.test;


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Test {

    public static void main(String[] args) {

        //时间 s1 和 e1 假设其是固定的,事先就已经预定好的时间段
        long s1 = dateToMs("2021-05-25 13:00:01");
        long e1 = dateToMs("2021-05-25 13:30:00");

        //新的时间 s2 和e2 时间是后续的视频会议时间段
        long s2 = dateToMs("2021-05-25 10:00:01");
        long e2 = dateToMs("2021-05-25 13:00:00");

        Boolean flag = isOverLap(s1, e1, s2, e2);
        if(flag){
            System.out.println("时间不冲突,可以预约");
        }else {
            System.out.println("时间有冲突,请重选时间段");
        }
    }

    /**
     * 需求是,传入两个时间段的时间戳,判断两个时间段是否存在冲突
     * @param s1 第一段时间的开始时间
     * @param e1 第一段时间的结束时间
     * @param s2 第二段时间的开始时间
     * @param e2 第二段时间的结束时间
     * @return  flag 代表是否处于重叠状态   true代表时间段重叠,false代表未重叠
     */
    public static boolean isOverLap(long s1, long e1, long s2, long e2){
        /**
         * 首先, s1-e1 时间戳与 s2-e2 的时间戳大小未知,那么会有两种情况,假设 s1-e1 的时间为 			2021-05-25 17:00:00 ~ 2021-05-25 18:00:00
         * 第一: s2-e2 的时间为 2021-05-25 19:00:00 ~ 2021-05-25 20:00:00
         * 第二: s2-e2 的时间为 2021-05-25 13:00:00 ~ 2021-05-25 14:00:00
         * 所以要分两种情况
         * 如果 s2 > e1,则代表第一种情况不会发生时间上的重叠,但不确定是否为第二种情况,所以还			需要再判断一下,第一个时间的时间戳是否大于第二个时间的时间戳
         */
        return s2 > e1 || s1 > e2 ? true : false;
    }

    /**
     * 时间转时间戳
     * @param _date 时间日期,如:2021-05-25 17:00:00
     * @return 返回时间戳
     */
    public static long dateToMs(String _date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        try {
            Date date = format.parse(_date);
            return date.getTime();
        } catch (Exception e) {
            return 0;
        }
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值