周一到周六每天一题,再来6题!!!

简介: 周一到周六每天一题,再来6题!!!

周一,谁才是最快的。。。

问:它们两个时间复杂度各是多少,或者说谁的速度更快呢?

public static void main(String[] args) {
    //HashMap
    HashMap<String,String> hashMap = new HashMap<>();
    hashMap.containsKey(key);
    //List
    List<String> list = new ArrayList<>();
    list.contains(key);
}

答: hashmap是先计算hashcode,然后定位定位到某个位置,然后再进行比较 其实现是和get一样的。所以时间复杂度是O(1) 而ArrayList是逐个比较,就相当于遍历,所以时间复杂度是O(n)

周二,我错了吗?

问:上面的程序有异常吗?如果没有输出什么?如果有,异常会发上在哪一行,又会抛出什么异常?然后如何改正?请把答案写在问答区。

public static void main(String[] args) {
    //阿里巴巴fastjson
1.    HashMap<String, String> map = new HashMap<>();
2.    map.put("姓名","小编");
3.    map.put("年龄","18");
4.    HashMap<String, HashMap<String, String>> mapMap = new HashMap<>();
5.    mapMap.put("小编",map);
6.    String jsonStr = JSONObject.toJSONString(mapMap);

7.    HashMap<String, HashMap<String, String>> jsonToMap = 
            (HashMap<String, HashMap<String, String>>)JSONObject.parseObject(jsonStr, HashMap.class);
8.    HashMap<String, String> hashMap = jsonToMap.get("小编");
9.    System.out.println(hashMap.get("姓名"));
}

答:错误是第八行,数据类型转换异常。正确的写法是:

JSONObject.parseObject(jsonStr, new TypeReference<HashMap<String, HashMap<String, String>>>(){});

周三,HashMap Key重复?

问:T重写了equals方法。上面程序输出是什么?此题考察了哪些知识点。

@Data
static class T {
    private Integer id;
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        T t = (T) o;
        return Objects.equals(id, t.id) &&
                Objects.equals(name, t.name);
    }
}

public static void main(String[] args) throws IOException {
    HashMap<T,String> hashMap = new HashMap<>();
    T t1 = new T();
    t1.setId(1);
    t1.setName("小编");
    hashMap.put(t1,"未知");
    T t2 = new T();
    t2.setId(1);
    t2.setName("小编");
    hashMap.put(t2,"未知");
    System.out.println(hashMap.size());
}

答:答案是2。map判断存放的对象是否重复,是根据key的hash值进行运算后,来比较key是否相同。类重写equlas方法是一定要重写hashcode方法的。这段代码只重写了equlas方法,从表面看两个对象是同一个对象,但他们的hash值并不一样。所以map会存放两个对象的。

周四,我还在傻傻的用a.equals(b)

问:在下面写下你的代码,功能判断两个字符串是否一样。要以最优雅的方式哦

public static void main(String[] args) {
    //a未知,有可能为null,有可能有值
    String a;
    //b未知,有可能为null,有可能有值
    String b;
    //判断两个字符串是否一样
    Boolean test = test(a, b);
    System.out.println(test);
}

public static Boolean test(String a, String b) {
    //TODO
    //判断两个字符串是否一样,
    //以最优雅的方式补全代码
    
}

答:答案是 return Objects.equals(a, b);有的读者回答也有StringUtils.equals(a,b)功能实现了, 但是引入的包是import org.apache.commons.lang.StringUtils;会和其他的StringUtils包冲突,产生不美观写法,所以不建议。

周五,我用了double他让我滚蛋,这次我用BigDecimal

问:上面程序输出结果是什么?原因呢?

public static void main(String[] args) {
    //double x = 0.1;
    //double y = 0.2;
    //double z = 0.3;
    //众所周知。x + y == z 为false
    //那么下面我替换成这样输出结果是什么
    BigDecimal a = new BigDecimal(0.1);
    BigDecimal b = new BigDecimal(0.2);
    BigDecimal c = new BigDecimal(0.3);
    //BigDecimal 的compareTo 是比较大小
    //-1 小于
    //0 等于
    //1 大于
    //为了方便看我换了行
    System.out.println(
      (a.add(b)).compareTo(c)==0
      );
}

答:答案是false我们都知道BigDecimal,但是用法是有问题的就以这个例子来说,0.2在存入计算机的时候已经不精确了,你在用BigDecimal构造方法也是不精确的,BigDecimal 源码里有个long valBits = Double.doubleToLongBits(val);就好比你给别人错误的值却想要正确的答案是不可能的。所以BigDecimal a = new BigDecimal("0.2");这种才是正确的写法。

周六,周六放松下换个逻辑题目

问:请写出你的选择,并解释下原因。

有三扇门,只有一扇门后有奖品,你选了一扇,
于是有两扇门你没选,主持人为你排除一扇没有奖
品的门,问你改不改变你原来的选择?为什么?

答:如果你不换门,那概率是1/3。
如果你换了门。那概率是2/3。
我们这个题目换个思路。我和你同时参赛,你选择一扇门,我也可选择一扇门,你先选,你选选过后的两扇门都归我。
也就是你的概率是1/3,我的概率是2/3。
你会说我不是只能选一扇门吗,是的,我会让主持人帮我排除一扇门,所以我选的那扇门的概率就是2/3。
所以答案是换,因为换的概率变成了2/3

相关文章
|
7月前
|
算法
leetcode-1185:一周中的第几天
leetcode-1185:一周中的第几天
54 0
|
2月前
蓝桥杯真题time模块详解 | 顺子日期 星期一
蓝桥杯真题time模块详解 | 顺子日期 星期一
|
编译器
周一到周六每天一题,你对了几个?
周一到周六每天一题,你对了几个?
|
程序员
蓝桥杯倒数七天之每日复习第一天
大家好,我是泡泡,离蓝桥杯还有一周,大家放平心态!!冲刺省一 国一!!! 因为是复习,是之前做过的题,跟着做过的小伙伴试着别看自己之前的代码敲出来!
160 0
蓝桥杯倒数七天之每日复习第一天
SqlServer 获取工作日(周六、周日休息,周六日不休息,周六不休息)
SqlServer 获取工作日(周六、周日休息,周六日不休息,周六不休息)
248 0
打印日期(华中科技大学考研机试)
打印日期(华中科技大学考研机试)
120 0
打印日期(华中科技大学考研机试)