阿里面试

首先,因为经过了笔试,我想面试应该更多的会涉及一些基础问题,再准备了一天基础问题之后,面试官上来就给了一道编程题,一下给我干懵了。

可能也是因为第一次面试,觉得发挥的很差,很多东西都没有想起来,一血给了大厂也是值得了,最起码知道了自己现在最欠缺的是什么,实力还差的远。

题目:输入N个int型数组,输出一个有序数组。(不能调用第三方库)(听起来很简单,但感觉又有不少坑,而且在网页上直接写,没有ide的提示,除了逻辑想法,对基础方法的掌握还有待加强)。

public class Main{
    public static void main(String[] args) {
        int[][] arr = new int[][]{
            {1,2,3},
            {7,6,8},
            {4,6,9},
            {12,18,63},
            {1,96,10003,569}
        };
        int[] newArray = getSort(arr);
        for(int i : newArray) {
            System.out.print(i + " ");
        }
        
    }
    public static int[] getSort(int[][] arr) {
        StringBuilder builder = new StringBuilder();
        for(int k = 0 ; k < arr.length ; k ++) {
            for(int i = 0 ; i < arr[k].length ; i ++) {
                builder.append(arr[k][i] + " ");
            }
        }
        String[] newArr = builder.toString().split(" ");
        
        int[] mArr = new int[newArr.length];
        for(int i = 0 ; i < newArr.length ; i ++) {
            mArr[i] = Integer.parseInt(newArr[i]);
        }
        return sort(mArr);
    }
    public static int[] sort(int[] arr) {
        for(int i = 0 ; i < arr.length ; i ++) {
            for(int k = 0 ; k < arr.length - i - 1 ; k ++) {
                if( arr[k] > arr[k + 1]) {
                    int temp = arr[k + 1];
                    arr[k + 1] = arr[k];
                    arr[k] = temp;
                }
            }
        }
        return arr;
        
    }
}

做的有些繁琐,排序应该没什么问题,用的冒泡排序,主要在合并数组方面还有待改进,希望随着学习的深入可以想出可以更优化的方法吧。

总结一下刚才写代码遇到的坑:

1.下次遇到向数组中添加不确定个元素要优先想到StringBuilder/StringBuffer或者ArrayList(暂时还没有尝试过),面试的时候就死活想不起来,一直纠结在数组的循环怎么设置。

2.StringBuilder中添加元素,元素是一个挨一个的,可以考虑在append的时候加一个空格或者逗号,方便转化为字符串再转化为字符串数组时分割,.split()这个方法印象中有,一直没想起来方法名,而且得到的是字符串数组,还需要转化为int型数组。

3.字符串转换为int型,方法为Integer.parseInt()。

4.冒泡排序第二层循环 i < arr.length - k -1。每次都忘了要多-1。

目前想到的就这么多,需要学习的东西还有很多,继续加油吧。

4/16 更

昨天和哥交流了一下,都忘了数组复制这回事儿了

public class Solution4{
    public static void main(String[] args) {
        int[][] arr = new int[][]{
                {1,2,3},
                {7,6,8},
                {4,6,9},
                {12,18,63},
                {1,96,10003,569}
        };
        int[] newArray = sort(arr);
        for(int i : newArray) {
            System.out.print(i + " ");
        }

    }
    public static int[] sort(int[][] arr) {
//        StringBuilder builder = new StringBuilder();
//        for(int k = 0 ; k < arr.length ; k ++) {
//            for(int i = 0 ; i < arr[k].length ; i ++) {
//                builder.append(arr[k][i] + " ");
//            }
//        }
//        String[] newArr = builder.toString().split(" ");
//
//        int[] mArr = new int[newArr.length];
//        for(int i = 0 ; i < newArr.length ; i ++) {
//            mArr[i] = Integer.parseInt(newArr[i]);
//        }
//        return bubbleSort(mArr);
        int nums = 0;int index = 0;
//        for(int index = 0 ; index < arr.length ; index ++){
//            nums += arr[index].length;
//        }
        for(int[] ele : arr){
            nums += ele.length;
        }
        int[] res = new int[nums];

//        for(int k = 0 ; k < arr.length ; k ++){
//            System.arraycopy(arr[k],0, res, index, arr[k].length);
//            index += arr[k].length;
//        }
        for(int[] element : arr){
            System.arraycopy(element, 0, res, index, element.length);
            index += element.length;
        }
        return bubbleSort(res);
    }
    public static int[] bubbleSort(int[] arr) {
        for(int i = 0 ; i < arr.length ; i ++) {
            for(int k = 0 ; k < arr.length - i - 1 ; k ++) {
                if( arr[k] > arr[k + 1]) {
                    int temp = arr[k + 1];
                    arr[k + 1] = arr[k];
                    arr[k] = temp;
                }
            }
        }
        return arr;

    }
}

1.方法命名要有面向对象的含义

2.变量定义容易理解

3.增强型for循环有时候用起来比普通for循环好用得多

原文地址:https://www.cnblogs.com/HarSong13/p/10703891.html