2019面试题总结(一)

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请标明原文出处。 https://blog.csdn.net/qq_31408331/article/details/86572142

/*
 * 实现斐波拉切数列
 */
public class feibolaqi {

    public static void main(String[] args) {
        for(int i = 1; i < 10 ; i++) {
            System.out.println(F(i));
        }
    }
    //获得斐波拉切数列的第n项
    public static int F(int i) {
        if(i == 0) {
            throw new RuntimeException("输入有误!"+ i);
        }
        else if(i == 2 || i == 1 ) {
            return 1;
        }else {
            return F(i-1) + F(i-2);
        }
    }
}


/*
 *字符串排序和去重
 */
public class QuChong {
    public static void main(String[] args) {
        String str = "GGHRAAERRASDDDBBCEDDFFE";//ABCEDF
        //System.out.println(distinct(str));
        System.out.println(sortAnddistinct(str));
        
    }
    
    
    //去重
    public static String distinct(String str) {
        char[] tmp = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        Set<Character> sets = new HashSet<Character>();
        for(int i=0;i<tmp.length;i++) {
            if(sets.contains(tmp[i])) {
                //pass
            }else {
                sb.append(tmp[i]);
                sets.add(tmp[i]);
            }
        }
        
        return sb.toString();
    }
    //排序去重
    public static String sortAnddistinct(String str) {
        char[] chars = str.toCharArray();
        //排序
        int len = chars.length;
        for(int i=0;i<len--;i++) {
            for(int j=0;j<len;j++) {
                char tmp = chars[j];
                if(chars[j] > chars[j+1]) {
                    chars[j] = chars[j+1];
                    chars[j+1] = tmp;
                }
            }
        }
        //排序后
        System.out.println(String.valueOf(chars));
        //去重
        return distinct(String.valueOf(chars));
        
    }
}


/*
 * 实现两个超出int范围的数相加  
 */
public class BigInteger {
    public static void main(String[] args) {
        String str1 = "00012734284";
        String str2 = "00738237821";
        System.out.println(add(str1,str2));
    }
    
    public static String add(String str1, String str2) {
        StringBuilder res = new StringBuilder();
        
        //同步两个参数长度
        int len1 = str1.length();
        int len2 = str2.length();
        if(len1 == 0 || len2 ==0) {
            res.append(str1 + str2);
        }
        else
        {    
            if(len1 == len2) {
                method(str1, str2, res, len1);
            }
            else if(len1 > len2) {
                int le = len1 - len2;
                while(le > 0) {
                    str2 ="0" + str2;
                    le--;
                }
                method(str1, str2, res, len1);
            }
            else if(len1 < len2) {
                int le = len2 - len1;
                while(le > 0) {
                    str1 ="0" + str1;
                    le--;
                }
                method(str1, str2, res, len2);
            }
        }
        //去除开头的0
        String resV = res.reverse().toString();
        
        //查找连续
        if(resV.startsWith("0")) {
            int x = 0;
            char[] cs = resV.toCharArray();
            for(int i = 0; i< cs.length; i++) {
                if(cs[i] == '0') {
                    x++;
                }else {
                    break;
                }
            }
            
            resV = resV.substring(x);
        }
        
        return resV;
    }

    public static void method(String str1, String str2, StringBuilder res, int len1) {
        int tmp = 0;
        for(int i = len1-1; i >= 0;i--) {
            int v1 = Integer.parseInt(String.valueOf(str1.charAt(i)));
            int v2 = Integer.parseInt(String.valueOf(str2.charAt(i)));
            int sum = v1 + v2 + tmp;
            if(sum >= 10) {
                tmp = sum / 10;
                int lastV = sum % 10;
                res.append(lastV);
            }else {
                tmp = 0;
                res.append(sum);
            }
        }
    }
}


/*
 * 判断一个数组中,是否存在任意两项相加等于给定的数
 */
public class Demo {
    public static void main(String[] args) {
        //
        int[] arr = {1,2,3,4,5,6,7,8,9};
        System.out.println(exist(arr,4));
        System.out.println(exist2(arr,4));
    }
    
    //是否存在任意两项之和等于n
    //算法的时间复杂度位o(n^2)
    public static boolean exist(int[] arr,int n) {
        boolean res = false;
        int len = arr.length;
        if(len < 2) {
            return false;
        }
        
        for(int j = len-1;j>=0;j--) {
            for(int i = 0; i<len; i++) {
                System.out.println(arr[j] + "+" +arr[i] + "="+n +"?");
                if(arr[j] + arr[i] == n && j != i) {
                    res = true;
                    break;
                }
            }
        }
        
        return res;
    }
    //算法优化
    public static boolean exist2(int[] arr, int n) {
        boolean res = false;
        int len = arr.length;
        if(len < 2) {
            return res;
        }
        //借助HashSet
        Set<Integer> sets = new HashSet<>();
        for(int i=0;i<arr.length;i++) {
            sets.add(arr[i]);
        }
        //判断是否存在
        for(int i=0; i<arr.length; i++) {
            if(sets.contains(n-arr[i]) && n-arr[i] != arr[i]) {
                res = true;
            }
        }
        return res;
    }
}


/*
 * java 中的值传递和异常处理try-catch-finally
 */
public class Demo2 {
    public static void main(String[] args) {
        //基本数据类型
        int a = 1;
        add(a);
        System.out.println("方法外:"+a);
        //引用数据类型
        List<Integer> list = new ArrayList<Integer>();
        add(list);
        System.out.println("方法外:"+list);
        
        int b = 1;
        List<String> arrlist = new ArrayList<String>();
        try {
            arrlist.add("111");
            b++;
            int i = 10 /0;
        }catch(Exception e) {
            b++;
            arrlist.add("222");
        }finally {
            b++;
            arrlist.add("3333");
        }
        System.out.println("b:"+b++);
        System.out.println("arrlist:"+arrlist);
    }
    
    //基本数据类型值传递
    public static void add(int i) {
        i++;
        System.out.println("方法内:" + i);
    }
    //引用类型的值传递
    public static void add(List<Integer> list) {
        list.add(10);
        System.out.println("方法内:" + list);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31408331/article/details/86572142