Java面试2

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了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值