9.28日西安xx软件开发岗位面试(较水)
1、业务场景题
1.1、关于Java基础集合中的场景题1:
请听题:如果要对你所在办公室的物品:比如说:桌子,书,椅子,笔的价格排序,我想要知道最便宜的物品的名字,怎么设计?
我的考虑如下:
- 第一种:用数据库
- 第二种:纯Java代码
1.1.1、数据库层面
在数据库层面,我们可以设计这么一张表叫thing(物品):id, name ,price
查阅资料的小知识点:where的判断条件里不能加聚合函数,具体请看mysql执行流程
那么直接写sql就是:
SELECT `name` AS '最贵的物品是:' FROM thing
ORDER BY price DESC
LIMIT 1
思路:
- 只查询字段name
- 通过排序来查找最便宜的或者最贵的物品的名字
- 最后通过分页只拿排序后的第一天数据
1.1.2、纯Java层面
既然要存放这么多物品对象,并且排序只输出对象的一个属性,那么首先就要考虑集合。但是到底用哪一个集合呢,
List、Map、Set
- List:有序(根据数组的下标一个接一个的放)、不唯一(数组元素可以重复)
- Map:无序(底层是对key做哈希运算来得到个索引来存放一个键值对Entry),唯一(只针对key唯一)
- Set:无序(set的底层实现其实是Map,通过计算key的哈希值来确定元素在数组中的存放位置),唯一
既然要的到最贵的或者最便宜的,那这个集合必须是有序的才能排序,所以只能用List,这里我用了最常见的ArrayList,底层是对象数组,非线程安全。
思路:
- 将SomeThing对象数组add存入ArrayList
- 对ArrayList排序(重写比较器compare即可)拿到第一个元素和最后一个元素输出
代码实现:
public class number1 {
public static void main(String[] args) {
SomeThing desk = new SomeThing("桌子", 17L);
SomeThing yizi = new SomeThing("椅子", 6L);
SomeThing book = new SomeThing("书", 70L);
SomeThing bi = new SomeThing("笔", 50L);
ArrayList<SomeThing> things = new ArrayList<>();
things.add(desk);
things.add(yizi);
things.add(book);
things.add(bi);
things.sort((o1, o2) -> (int) (o2.getPrice()-o1.getPrice()));
System.out.println("最贵的是: "+things.get(0).getName());
System.out.println("最便宜的是: " + things.get(3).getName());
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class SomeThing{
private String name;
private Long price;
}
结果:
2、SQL语句问题
针对上述的物品,如何找到价格在50到100之间的物品名字呢
这是一个sql语句编写问题。
SELECT `name` FROM thing
WHERE price BETWEEN 50 AND 100
-- 这样也可以
SELECT `name` FROM thing
WHERE price>=50 AND price<=100
3、算法题
有一个案例,如何将a.txt 和 b.txt,a取一行写入c.txt,b取一行写入c.txt,但是不知道a有几行,b有几行,所以要考虑周到。
这其实就是一个算法题,由于不确定a和b的行数,所以可能会存在类似于数组越界问题。
由于面试官只要求思路,所以我们用数组或者链表的解法来做。
算法只能说刷LeetCode Top100了