首先,因为经过了笔试,我想面试应该更多的会涉及一些基础问题,再准备了一天基础问题之后,面试官上来就给了一道编程题,一下给我干懵了。
可能也是因为第一次面试,觉得发挥的很差,很多东西都没有想起来,一血给了大厂也是值得了,最起码知道了自己现在最欠缺的是什么,实力还差的远。
题目:输入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循环好用得多