前阵子参加了一个面试,被问到假设有一个数组
int[] arr = new int[] { 7, 2, 4, 6, 0, 0, 0, 1, 6 };
需要删除数组内小于1的数,限制条件分别有:
Ⅰ 不能采用遍历当前数组,复制符合条件的数字到新开辟数组的方式
Ⅱ 不能采用遍历当前数组,删除不符合条件的数字并把之后数字前移的方式
当时唯一想到便是快速排序的做法,以1为参照,把数组内的数据分开,然后截取,最终发生了两个悲剧的事情:
㈠ 出题人表示不但要分开,还必须保持原顺序
㈡ 竟然忘记快速排序是如何运作
这是一件十分丢人的事情,工作中几乎用不到算法,面试需要时才临时抱佛脚地找点程序看看,到最终害死自己。时至今日,仍然不知道当初的题目应该如何解,虽然被提示使用subList方法。无论如何必须认真复习快速排序,否则这一跤白摔了。
package algorithms.test; /** * 快速排序的测试 * * @author super */ public class QuickSort { public int[] arr = new int[] { 7, 2, 4, 6, 0, 0, 0, 1, 6 }; public int[] sort2(int[] datas, int low, int high) { int i = low, j = high, key = datas[low], tmp; while (i < j) { while (i < j && datas[j] >= key) { j--; } while (i < j && datas[i] < key) { i++; } if (i < j) { tmp = datas[i]; datas[i] = datas[j]; datas[j] = tmp; } } if (i - low > 0) { sort2(datas, low, i); } if (high - i > 1) { sort2(datas, i + 1, high); } return datas; } /** * 测试主方法 * * @param args */ public static void main(String args[]) { QuickSort q = new QuickSort(); int[] t = q.arr; q.sort2(t, 0, t.length - 1); for (int i = 0; i < t.length; i++) { System.out.print(t[i] + " "); if ((i + 1) % 10 == 0) { System.out.println(); } } } }