题目:调整数组顺序使奇数位于偶数前面
输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前班部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
解题思想:
方案1: 归并排序的思想。利用辅助空间进行排序,判断每个数,如果是奇数放入数组的左边,如果是偶数从右边开始放。
方案2:快速排序的思想。不需要辅助空间,利用两个指针,从最左边和最右边的数判断,如果左指针指向的数为偶数,右指针指向的数为奇数,交换着两个数。
java实现代码示例:
1 | public class 调整数组顺序_奇左偶右 { |
程序执行结果:
1 | 51 29 34 65 22 55 89 58 51 61 |
题目:第K个元素
以尽量高的效率求出一个乱序数组中按数值顺序的第k个元素。
解题思想:
利用分区法的思想。每次找到一个中位数主元,将小于主元的放左边,大于主元的放右边。递归寻找。
代码示例:
1 | public class 第k小数 { |
程序运行结果:
1 | 74 90 98 8 82 21 5 30 32 49 |
题目:超过一半的数字
数组汇总有一个数字出现的次数超过了数组长度的一半,找出这个数字
1 |
|
程序运行结果:
1 | 3 |
变化:出现的数恰好为总数的一半,求出这个数
1 | //变化,出现次数恰好为个数的一半,求出这个数 |
题目:最小可用ID
在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数量1000000.
1 | public class 最小可用id { |
题目:合并有序数组
给定两个排序后的数组A和B,其中A的末端有足够的空间容纳B。编写一个方法,将B合并入A并排序。
1 | public class 合并有序数组 { |
程序运行结果:
1 | 1 2 3 4 5 6 7 8 9 10 13 15 0 0 |
题目:逆序对个数
一个数列,如果左边的数大,右边的数小,则称这两个数位一个逆序对。求出一个数列中有多少个逆序对。
1 | package chapter3_排序; |
程序运行结果:
1 | 97 40 30 69 78 55 84 5 6 62 |
二叉树与数组:
将二叉树存储在数组中,并遍历二叉树。
1 | package chapter3_排序; |
程序运行结果:
1 | 先序遍历:1 2 4 5 3 6 7 |
题目:排序数组中找和的因子
给定已排序数组arr和k,不重复打印arr中所有相加为和为k的不降序二元组。
如输入arr={-8, -4, -3, 0, 2, 4, 5, 8, 9, 10}, k = 10
输出:(0, 10)(2, 8)
解题思路:
方案1:暴力法,时间复杂度O(n^2)
方案2:二分法,时间复杂度O(nlgn)
方案3:二指针扫描。时间复杂度O(n)
java代码示例:
1 |
|
程序运行结果:
1 | 方案1输出:(0,10)(2,8) |
题目:需要排序的子数组
给定一个无序数组arr,求出需要排序的最短子数组长度。
要求:时间复杂度O(n)
如输入:arr={2, 3, 7, 5, 4, 6},返回4,因为只有{7, 5, 4, 6}需要排序。
java代码示例:
1 | public class 需要排序的子数组长度 { |
程序运行结果:
1 | 2 3 |
题目:前k个数
求海量数据(正整数)按逆序排列的前k个数(topk),因为数据量太大,不能全部存储在内存中,只能一个一个地从磁盘或者网络上读取数据,请设计一个高效的算来解决这个问题。
第一行:用户输入k,代表用求得的topK
随后的N(不限制)行,每一行是一个正整数代表用户输入的数据。用户每输入一个数据就回车使得程序可以立即获得这个数据,用户输入-1代表输入终止。
请输出topK,从小到大,空格分割。
解题思路:
思路:维持一个一个k大的数组,每次输入数,与k个数组中最小的比较,如果大于最小的,与最小的进行交换,重复执行这个操作,最后剩下的就是最大的k个数。
解法1:时间复杂度Kn,如果每次在数组中用顺序扫描法寻找最小数的的时间复杂度是k,N个数,所以总时间复杂度kN。
解法2:利用小顶堆,可将时间复杂度降到NlgK.
解法1代码示例:
1 | import java.util.Arrays; |
程序运行结果:
1 | 3 |
解法2代码示例:
1 | import java.util.Arrays; |
程序运行结果:
1 | 4 |
题目:所有员工年龄排序
公司现在要对几万员工的年龄进行排序,因为公司的人数非常多,所以要求排序算法的效率非常高,你能写出这样的程序吗
输入:输入可能包含多个测试样例,对于每个测试案例,
- 输入的第一行为一个整数n(1<=n <=1000000):代表公司内员工人数。
- 输入的第二行包括n个整数:代表公司内每个员工的年龄。其中员工年龄的取值范围为(1 <= age <= 99)
输出:对应每个测试案例,
- 请输出排序后的n个员工的凝练,每个年龄后面有一个空格
解题思想:
因为年龄段是固定的,所以可以利用计数排序的思想进行排序,时间复杂度可达到O(n)
java代码示例:
1 | import java.util.Scanner; |
程序运行结果:
1 | 5 |
题目:数组能排成的最小数(特殊排序)
输入一个正整数数组,把数组里所有的整数拼接起来排成一个数,打印出能拼接的所有数字中最小的一个。
例如:输入数组{3,32,321},则打印出3这个数字能排成的最小数字为:321323
解题思路:
利用api的Arrays.sort,在排序过程中传入比较器,自己定义比较的规则。进行排序。
java示例代码:
1 | import java.util.Arrays; |
程序执行结果:
1 | 321323 |
题目:数组的包含
输入两个字符串str1和str2,请判断str1中的所有字符是否都存在str2中。
java代码示例:
1 | import java.util.Arrays; |
程序运行结果:
1 | s1是否包含在s2中:false |