面试一定要复盘,说不定复试时就考了,谨记谨记!
记录一下一个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;
}
}
}