整理最近面试遇到的一些问题

最近在求职,陆陆续续会有很多面试,现在凭想象力记下来,总结自己面试中回答不太好的地方:

18/08/13 周一 上午 ,云途

1.如何将给定的字符串内容反转?即倒序

该问题,当时回答不是很好,回来后自己敲了下,发现自己不足.以下列出四种解决方案:

方案一:for循环遍历, 根据索引从后向前取字符串中的字符:

   public String reverse2(String value){
        if (value == null || value.length() < 2){
            return value;
        }
        String newValue = "";
        for (int i = (value.length() - 1); i >= 0; i--) {
            newValue += value.charAt(i);
        }
        return newValue;
    }

方案二:将字符串转为char数组,然后倒叙取出每个字符,跟方案一类似:

    public String reverse3(String value){
        if (value == null || value.length() < 2){
            return value;
        }
        String newValue = "";
        char[] charArray = value.toCharArray();
        for (int i = (charArray.length- 1); i >= 0; i--) {
            newValue += charArray[i];
        }
        return newValue;
    }

方案三:先将字符串转为StringBuilder 或者StringBuffer ,再利用二者的实例方法reverse,实现倒叙后 转为toString() ,这种方式最方便,不需要自己写方法

    public String reverse3(String value){
        if (value == null || value.length() < 2){
            return value;
        }
        return new StringBuffer(value).reverse().toString();
    }

方案四:利用递归,将传入的字符串首个字符拼到末尾,同时截取字符串,依次递归,直到字符串长度为1

    public String reverse(String value){
        if (value == null || value.length() < 2){
            return value;
        }
        return reverse(value.substring(1)) + value.charAt(0);
    }

2.现有两个ArrayList,需要将两个集合元素全部添加到一个集合中, 并且去除重复的元素,如何实现?

思路:首先得到1个总的ArrayList,然后将ArrayList转为HashSet,利用HashSet的特性(元素不可重复)完成去重;

    @org.junit.Test
    public void name() {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();

        list1.add(1);
        list1.add(2);
        list1.add(3);

        list2.add(2);
        list2.add(3);
        list2.add(4);

        list1.addAll(list2);
        System.out.println(list1);

        //将List转为Set
        HashSet<Integer> set = new HashSet<>(list1);
        System.out.println(set);

        //也可以通过同样的方式将Set转为List
        System.out.println(new ArrayList<>(set));
    }

原理是构造器可以接收Collection类型的对象:

 3.如何得到字符串去重后的长度? 例如:hello 去重后 是 helo ,长度也就是4;

    @org.junit.Test
    public void myTest() {
        String str = "Hello";
        Set<Object> hashSet = new HashSet<>();

        for (int i = 0; i < str.length(); i++) {
            hashSet.add(str.charAt(i));
        }
        System.out.println(hashSet.size());
    }

也可以通过ArrayList完成,但是需要加一个contains的判断:

    @org.junit.Test
    public void myTest2() {
        String str = "Hello";
        List<Object> list = new ArrayList<>();

        for (int i = 0; i < str.length(); i++) {
            if (!list.contains(str.charAt(i))){
                list.add(str.charAt(i));
            }
        }
        System.out.println(list.size());
    }

4.上个问题中 ,contains(object)方法,判断list中是否已经存在某个元素,contains方法判断是否为同一个元素的原理是什么?

答: ArrayList中有一个方法: indexOf(object) 如果object存在与list中,则返回大于相应的索引,否则返回-1

如果indexOf()返回的值大于-1,则表示已存在,某则不存在;

下面是contains方法与indexOf方法的源代码:

public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

猜你喜欢

转载自www.cnblogs.com/lzzRye/p/9468177.html