小编面试遇到的笔试题

1.在杭州梦想小镇一处面试地点,做互联网开发,给政府做项目的新型公司

问题(1)在一个List中有非常多的数据,也有非常多重复的数据,现在想将这个List中重复的数据清除,只留下单个唯一数据。

小编的回答1(想了一会):先将这个List循环放在一个Object[]数组中以,分开,然后全部toString()为一个String[]数组(有一点浪费内存,如果这个List非常大的话),然后通过Arrays.sort()方法排序,再通过Regex正则表达式将排序后的重复的数进行替换为单一的数,完成。大致代码如下:

        
        Object[] obj = sSorted.toArray(new Object[sSorted.size()]);
        //将Obj类型toString为字符类型
        String[] str = new String[obj.length];
        for (int i = 0; i < obj.length; i++) {
            str[i] = obj[i].toString();
        }
        //对这个String数组排序
        Arrays.sort(str);
        //转换为String字符串
        String mess = Arrays.toString(str);
        //通过正则表达式剔除重复字符
        mess = mess.replaceAll("([\\u4E00-\\u9FA5a-zA-Z\\d.]*,\\s)\\1+", "$1");
        //转换回String数组
        String[] list = mess.split(",");
        

面试官说了一些这个方法的不好点,如内存消耗大,逻辑代码过长,而且List中有各种类型的数据,你能保证转换为String后没有问题吗,并且正则表达式不是只能对单个字符进行判断什么的,反正就是不太好,他让我想想还有没有更简单的方法。

我想这个方法确实执行非常麻烦,正则表达式编写复杂,而且消耗也很大。而且bug也很多,最后一位不能得到判断

小编的回答2(想了一会,面试脑子一片空白,平时也没有做过此类题目,下面是面试后小编的答案):将原来的一个List赋值于新的List,双层for循环判断list.get(i).equals(list.get(j)) && i != j 如果这个条件成立遍删除集合中这个j的值,因为equals判断,所以如果出现“12”,12,12F,12D等相同值类型不同值也都不会被替换的,下面是小编的代码:

        List list = lists;
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size(); j++) {
                if (list.get(i).equals(list.get(j)) && i != j) { //&& i !=j 避免是同一个值
                    lists.remove(j); //这里是lists
                }
            }
        }

这个就简介多了,但是面试官给的答案更简单:

 Set<String> set = new HashSet<>();
 set.addAll(list);

就两行代码,声明一个set集合,使用set集合不存储重复值的原理一个个添加List集合中的值,这样就过滤了重复的值了

我当时是怎么都想不到这个解决方法,惭愧惭愧

后来小编在网上搜索了一下,既然还有跟简单的方法,只要一行代码,并且直接输出这个集合了。这个方法使用了java8的新特性,Stream流的概念。

System.out.println(lists.stream().distinct().collect(Collectors.toList()));

--------------------------------------------------------

2.这个是网上看到的一个题目,想编写下来做为参考

以下有一个 static method,类外会调用它,一个个地插入一些元素进入一个List。可以改变这个List内容的,只有这一个method,要求任何时候这个List都是有序的。比如,依次插入3、2、1、2,我希望List的顺序是1、2、2、3。

class Solution {
    private static List<Integer> sSorted = new LinkedList<>();
    public static void addElement(int e) {
        // TODO: Insert e to sSorted and make sure sSorted is always sorted.
    }
}

https://mp.weixin.qq.com/s/H9I2p9UBjvrS3MQQcBbz0w文章原地址:如果感兴趣可以看看,不要着急看答案:

如果做好的朋友可以点击下方按钮查看答案

https://blog.csdn.net/qq_41426326/article/details/89207681

猜你喜欢

转载自blog.csdn.net/qq_41426326/article/details/89202984